qed 2.5.0 → 2.5.1
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.
- data/.ruby +47 -0
- data/bin/qed +1 -1
- data/lib/qed/demo.rb +18 -7
- data/lib/qed/evaluator.rb +31 -8
- data/lib/qed/reporter/abstract.rb +4 -4
- data/lib/qed/reporter/verbatim.rb +5 -3
- data/lib/qed/scope.rb +22 -6
- data/lib/qed/session.rb +240 -18
- data/lib/qed/settings.rb +155 -0
- data/lib/qed.rb +18 -17
- data/lib/qed.yml +47 -0
- data/lib/yard-qed.rb +1 -0
- metadata +16 -24
- data/History.rdoc +0 -210
- data/eg/hello_world.rdoc +0 -15
- data/eg/view_error.rdoc +0 -21
- data/eg/website.rdoc +0 -12
- data/lib/qed/command.rb +0 -387
- data/lib/qed/meta/data.rb +0 -27
- data/lib/qed/meta/package +0 -10
- data/lib/qed/meta/profile +0 -16
- data/meta/data.rb +0 -27
- data/meta/package +0 -10
- data/meta/profile +0 -16
data/.ruby
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
---
|
2
|
+
spec_version: 1.0.0
|
3
|
+
replaces: []
|
4
|
+
|
5
|
+
loadpath:
|
6
|
+
- lib
|
7
|
+
name: qed
|
8
|
+
repositories:
|
9
|
+
public: git://github.com/proutils/qed.git
|
10
|
+
conflicts: []
|
11
|
+
|
12
|
+
engine_check: []
|
13
|
+
|
14
|
+
title: QED
|
15
|
+
resources:
|
16
|
+
home: http://proutils.github.com/qed
|
17
|
+
work: http://github.com/proutils/qed
|
18
|
+
maintainers: []
|
19
|
+
|
20
|
+
requires:
|
21
|
+
- group: []
|
22
|
+
|
23
|
+
name: ansi
|
24
|
+
version: 0+
|
25
|
+
- group: []
|
26
|
+
|
27
|
+
name: facets
|
28
|
+
version: 2.8+
|
29
|
+
- group: []
|
30
|
+
|
31
|
+
name: ae
|
32
|
+
version: 0+
|
33
|
+
- group:
|
34
|
+
- build
|
35
|
+
name: syckle
|
36
|
+
version: 0+
|
37
|
+
manifest: Manifest
|
38
|
+
version: 2.5.1
|
39
|
+
licenses: []
|
40
|
+
|
41
|
+
copyright: Copyright (c) 2006 Thomas Sawyer
|
42
|
+
authors:
|
43
|
+
- Thomas Sawyer <transfire@gmail.com>
|
44
|
+
organization: RubyWorks
|
45
|
+
description: QED (Quality Ensured Demonstrations) is a TDD/BDD framework utilizing Literate Programming techniques.
|
46
|
+
summary: Quod Erat Demonstrandum
|
47
|
+
created: 2006-12-16
|
data/bin/qed
CHANGED
data/lib/qed/demo.rb
CHANGED
@@ -17,19 +17,25 @@ module QED
|
|
17
17
|
# Parser mode.
|
18
18
|
attr :mode
|
19
19
|
|
20
|
+
# Working directory.
|
21
|
+
attr :cwd
|
22
|
+
|
20
23
|
# Scope to run demonstration within. (Known as a "World" in Cucumber.)
|
21
24
|
attr :scope
|
22
25
|
|
23
26
|
# New Script
|
24
27
|
def initialize(file, options={})
|
25
|
-
@file
|
26
|
-
@
|
27
|
-
@
|
28
|
-
|
28
|
+
@file = file
|
29
|
+
@mode = options[:mode]
|
30
|
+
@cwd = options[:at] || fallback_cwd
|
31
|
+
|
32
|
+
@scope = options[:scope] || Scope.new(applique, cwd, file)
|
33
|
+
|
34
|
+
@binding = @scope.__binding__
|
29
35
|
#apply_environment
|
30
36
|
end
|
31
37
|
|
32
|
-
# One binding per
|
38
|
+
# One binding per demo.
|
33
39
|
def binding
|
34
40
|
@binding #||= @scope.__binding__
|
35
41
|
end
|
@@ -46,8 +52,8 @@ module QED
|
|
46
52
|
|
47
53
|
#
|
48
54
|
def evaluate(code, line)
|
49
|
-
eval(code, @binding, @file, line)
|
50
|
-
|
55
|
+
#eval(code, @binding, @file, line)
|
56
|
+
@scope.eval(code, @file, line)
|
51
57
|
end
|
52
58
|
|
53
59
|
# Returns a cached Array of Applique modules.
|
@@ -105,6 +111,11 @@ module QED
|
|
105
111
|
# )
|
106
112
|
#end
|
107
113
|
|
114
|
+
# This shouldn't be needed, but is here as a precaution.
|
115
|
+
def fallback_cwd
|
116
|
+
@dir ||= File.join(Dir.tmpdir, 'qed', File.filename(Dir.pwd), Time.new.strftime("%Y%m%d%H%M%S"))
|
117
|
+
end
|
118
|
+
|
108
119
|
end
|
109
120
|
|
110
121
|
end
|
data/lib/qed/evaluator.rb
CHANGED
@@ -67,10 +67,14 @@ module QED
|
|
67
67
|
advise!(:when, step) # triggers matchers
|
68
68
|
rescue SystemExit
|
69
69
|
pass!(step)
|
70
|
-
rescue Assertion => exception
|
71
|
-
|
70
|
+
#rescue Assertion => exception
|
71
|
+
# fail!(step, exception)
|
72
72
|
rescue Exception => exception
|
73
|
-
|
73
|
+
if exception.assertion?
|
74
|
+
fail!(step, exception)
|
75
|
+
else
|
76
|
+
error!(step, exception)
|
77
|
+
end
|
74
78
|
else
|
75
79
|
pass!(step)
|
76
80
|
end
|
@@ -78,7 +82,22 @@ module QED
|
|
78
82
|
|
79
83
|
#
|
80
84
|
def evaluate_data(step)
|
81
|
-
advise!(:data, step)
|
85
|
+
#advise!(:data, step)
|
86
|
+
begin
|
87
|
+
advise!(:data, step)
|
88
|
+
rescue SystemExit
|
89
|
+
pass!(step)
|
90
|
+
#rescue Assertion => exception
|
91
|
+
# fail!(step, exception)
|
92
|
+
rescue Exception => exception
|
93
|
+
if exception.assertion?
|
94
|
+
fail!(step, exception)
|
95
|
+
else
|
96
|
+
error!(step, exception)
|
97
|
+
end
|
98
|
+
else
|
99
|
+
pass!(step)
|
100
|
+
end
|
82
101
|
end
|
83
102
|
|
84
103
|
# Evaluate a demo step.
|
@@ -87,11 +106,15 @@ module QED
|
|
87
106
|
advise!(:code, step)
|
88
107
|
@script.evaluate(step.code, step.lineno)
|
89
108
|
rescue SystemExit
|
90
|
-
pass!(step)
|
91
|
-
rescue Assertion => exception
|
92
|
-
|
109
|
+
pass!(step) # TODO: skip!(step)
|
110
|
+
#rescue Assertion => exception
|
111
|
+
# fail!(step, exception)
|
93
112
|
rescue Exception => exception
|
94
|
-
|
113
|
+
if exception.assertion?
|
114
|
+
fail!(step, exception)
|
115
|
+
else
|
116
|
+
error!(step, exception)
|
117
|
+
end
|
95
118
|
else
|
96
119
|
pass!(step)
|
97
120
|
end
|
@@ -189,7 +189,7 @@ module Reporter
|
|
189
189
|
|
190
190
|
# After running a step that raised an error.
|
191
191
|
def error(step, exception)
|
192
|
-
raise exception if $DEBUG
|
192
|
+
raise exception if $DEBUG # TODO: do we really want to do it like this?
|
193
193
|
#@error << [step, exception]
|
194
194
|
end
|
195
195
|
|
@@ -237,8 +237,8 @@ module Reporter
|
|
237
237
|
end
|
238
238
|
|
239
239
|
def print_tally
|
240
|
-
assert_count =
|
241
|
-
assert_fails =
|
240
|
+
assert_count = AE::Assertor.counts[:total]
|
241
|
+
assert_fails = AE::Assertor.counts[:fail]
|
242
242
|
assert_delta = assert_count - assert_fails
|
243
243
|
|
244
244
|
mask = "%s demos, %s steps: %s failures, %s errors (%s/%s assertions)"
|
@@ -253,7 +253,7 @@ module Reporter
|
|
253
253
|
end
|
254
254
|
|
255
255
|
#
|
256
|
-
INTERNALS = /(lib|bin)[\\\/]qed/
|
256
|
+
INTERNALS = /(lib|bin)[\\\/](qed|ae)/
|
257
257
|
|
258
258
|
=begin
|
259
259
|
# Clean the backtrace of any reference to ko/ paths and code.
|
@@ -23,8 +23,8 @@ module Reporter #:nodoc:
|
|
23
23
|
|
24
24
|
#
|
25
25
|
def data(step)
|
26
|
-
io.puts step.clean_text.ansi(:blue)
|
27
|
-
io.puts
|
26
|
+
#io.puts step.clean_text.ansi(:blue)
|
27
|
+
#io.puts
|
28
28
|
end
|
29
29
|
|
30
30
|
#
|
@@ -34,6 +34,8 @@ module Reporter #:nodoc:
|
|
34
34
|
io.print "#{step.text}".ansi(:green)
|
35
35
|
elsif step.header?
|
36
36
|
io.print "#{step.text}".ansi(:bold)
|
37
|
+
elsif step.data?
|
38
|
+
io.print "#{step.text}".ansi(:blue)
|
37
39
|
else
|
38
40
|
io.print "#{step.text}"
|
39
41
|
end
|
@@ -48,7 +50,7 @@ module Reporter #:nodoc:
|
|
48
50
|
msg = []
|
49
51
|
#msg << ANSI::Code.bold(ANSI::Code.red("FAIL: ")) + error.message
|
50
52
|
#msg << ANSI::Code.bold(clean_backtrace(error.backtrace[0]))
|
51
|
-
msg << "FAIL: ".ansi(:bold, :red) + error.message #to_str
|
53
|
+
msg << "FAIL: ".ansi(:bold, :red) + error.message.to_s #to_str
|
52
54
|
msg << clean_backtrace(error.backtrace[0]).ansi(:bold)
|
53
55
|
io.puts msg.join("\n").tabto(tab||2)
|
54
56
|
io.puts
|
data/lib/qed/scope.rb
CHANGED
@@ -21,9 +21,10 @@ module QED
|
|
21
21
|
# end
|
22
22
|
|
23
23
|
#
|
24
|
-
def initialize(applique, file=nil)
|
24
|
+
def initialize(applique, cwd, file=nil)
|
25
25
|
super()
|
26
26
|
@_applique = applique
|
27
|
+
@_cwd = cwd
|
27
28
|
@_file = file
|
28
29
|
#@loadlist = []
|
29
30
|
|
@@ -61,12 +62,12 @@ module QED
|
|
61
62
|
end
|
62
63
|
|
63
64
|
# Evaluate code in the context of the scope's special binding.
|
64
|
-
|
65
|
-
|
65
|
+
# The return result of the evaluation is stored in `@_`.
|
66
|
+
def eval(code, file=nil, line=nil)
|
67
|
+
@_ = super(code, __binding__, @_file, line)
|
66
68
|
end
|
67
69
|
|
68
70
|
|
69
|
-
|
70
71
|
# Utilize is like #require, but will evaluate the script in the context
|
71
72
|
# of the current scope.
|
72
73
|
#--
|
@@ -89,7 +90,6 @@ module QED
|
|
89
90
|
end
|
90
91
|
|
91
92
|
|
92
|
-
|
93
93
|
# Define "when" advice.
|
94
94
|
def When(*patterns, &procedure)
|
95
95
|
patterns = patterns.map{ |pat| pat == :text ? :desc : pat }
|
@@ -113,7 +113,6 @@ module QED
|
|
113
113
|
end
|
114
114
|
|
115
115
|
|
116
|
-
|
117
116
|
# TODO: Should Table and Data be extensions that can be loaded if desired?
|
118
117
|
|
119
118
|
# Use sample table to run steps. The table file will be
|
@@ -165,6 +164,23 @@ module QED
|
|
165
164
|
#end
|
166
165
|
end
|
167
166
|
|
167
|
+
# Clear temporary work directory.
|
168
|
+
def clear_working_directory!
|
169
|
+
dir = @_cwd
|
170
|
+
dir = File.expand_path(dir)
|
171
|
+
|
172
|
+
if dir == '/' or dir == File.expand_path('~')
|
173
|
+
abort "DANGER! Trying to use home or root as a temporary directory!"
|
174
|
+
end
|
175
|
+
|
176
|
+
entries = Dir.glob(File.join(dir, '**/*'))
|
177
|
+
|
178
|
+
dirs, files = entries.partition{ |f| File.directory?(f) }
|
179
|
+
|
180
|
+
files.each { |file| FileUtils.rm(file) }
|
181
|
+
dirs.each { |dir| FileUtils.rmdir(dir) }
|
182
|
+
end
|
183
|
+
|
168
184
|
#
|
169
185
|
def const_missing(const)
|
170
186
|
Object.const_get(const)
|
data/lib/qed/session.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module QED
|
2
2
|
|
3
|
-
|
3
|
+
require 'qed/settings'
|
4
4
|
require 'qed/demo'
|
5
5
|
|
6
6
|
# The Session class encapsulates a set of demonstrations
|
@@ -9,27 +9,66 @@ module QED
|
|
9
9
|
#
|
10
10
|
class Session
|
11
11
|
|
12
|
-
#
|
13
|
-
|
12
|
+
# Default recognized demos file types.
|
13
|
+
DEMO_TYPES = %w{qed rdoc md markdown}
|
14
|
+
|
15
|
+
#
|
16
|
+
CODE_TYPES = %w{rb}
|
17
|
+
|
18
|
+
# Directory names to omit from automatic selection.
|
19
|
+
OMIT_PATHS = %w{applique helpers support sample samples fixture fixtures}
|
20
|
+
|
21
|
+
# Demonstration files (or globs).
|
22
|
+
attr_reader :files
|
23
|
+
|
24
|
+
# File patterns to omit.
|
25
|
+
attr_accessor :omit
|
14
26
|
|
15
27
|
# Output format.
|
16
28
|
attr_accessor :format
|
17
29
|
|
18
|
-
# Trace
|
30
|
+
# Trace execution?
|
19
31
|
attr_accessor :trace
|
20
32
|
|
21
|
-
#
|
33
|
+
# Parse mode.
|
22
34
|
attr_accessor :mode
|
23
35
|
|
36
|
+
# Paths to be added to $LOAD_PATH.
|
37
|
+
attr_reader :loadpath
|
38
|
+
|
39
|
+
# Libraries to be required.
|
40
|
+
attr_reader :requires
|
41
|
+
|
42
|
+
# Do not operate from project root?
|
43
|
+
attr_accessor :rootless
|
44
|
+
|
45
|
+
# Selected profile.
|
46
|
+
attr_accessor :profile
|
47
|
+
|
48
|
+
# Returns instance of Settings class.
|
49
|
+
attr :settings
|
50
|
+
|
24
51
|
# New Session
|
25
52
|
def initialize(files, options={})
|
26
53
|
require_reporters
|
27
54
|
|
28
|
-
@files
|
55
|
+
@files = [files].flatten
|
56
|
+
|
57
|
+
@format = options[:format] || :dotprogress
|
58
|
+
@trace = options[:trace] || false
|
59
|
+
@mode = options[:mode] || nil
|
60
|
+
@profile = options[:profile] || :default
|
61
|
+
@loadpath = options[:loadpath] || []
|
62
|
+
@requires = options[:requires] || []
|
29
63
|
|
30
|
-
@
|
31
|
-
|
32
|
-
@
|
64
|
+
@omit = OMIT_PATHS # TODO: eventually make configurable
|
65
|
+
|
66
|
+
@settings = Settings.new(options)
|
67
|
+
end
|
68
|
+
|
69
|
+
#
|
70
|
+
def directory
|
71
|
+
settings.tmpdir
|
33
72
|
end
|
34
73
|
|
35
74
|
# Top-level configuration.
|
@@ -53,8 +92,11 @@ module QED
|
|
53
92
|
end
|
54
93
|
|
55
94
|
# Returns an Array of Demo instances.
|
95
|
+
#--
|
96
|
+
# TODO: Pass settings to demo, so we can get temporary_dirctory.
|
97
|
+
#++
|
56
98
|
def demos
|
57
|
-
@demos ||=
|
99
|
+
@demos ||= demo_files.map{ |file| Demo.new(file, :mode=>mode, :at=>directory) }
|
58
100
|
end
|
59
101
|
|
60
102
|
#
|
@@ -63,16 +105,94 @@ module QED
|
|
63
105
|
end
|
64
106
|
|
65
107
|
# Run session.
|
108
|
+
#--
|
109
|
+
# TODO: remove loadpath additions when done
|
110
|
+
#++
|
66
111
|
def run
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
112
|
+
abort "No documents." if demo_files.empty?
|
113
|
+
|
114
|
+
clear_directory
|
115
|
+
|
116
|
+
prepare_loadpath
|
117
|
+
require_libraries
|
118
|
+
|
119
|
+
require_profile # TODO: here or in chdir?
|
120
|
+
|
121
|
+
Dir.chdir(directory) do
|
122
|
+
#profile.before_session(self)
|
123
|
+
reporter.before_session(self)
|
124
|
+
demos.each do |demo|
|
125
|
+
demo.run(*observers)
|
126
|
+
#pid = fork { demo.run(*observers) }
|
127
|
+
#Process.detach(pid)
|
128
|
+
end
|
129
|
+
reporter.after_session(self)
|
130
|
+
#profile.after_session(self)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
#
|
135
|
+
def clear_directory
|
136
|
+
settings.clear_directory
|
137
|
+
end
|
138
|
+
|
139
|
+
# Add to load path (from -I option).
|
140
|
+
def prepare_loadpath
|
141
|
+
loadpath.each{ |dir| $LOAD_PATH.unshift(dir) }
|
142
|
+
end
|
143
|
+
|
144
|
+
# Require libraries (from -r option).
|
145
|
+
def require_libraries
|
146
|
+
requires.each{ |file| require(file) }
|
147
|
+
end
|
148
|
+
|
149
|
+
#
|
150
|
+
def require_profile
|
151
|
+
settings.require_profile(profile)
|
152
|
+
end
|
153
|
+
|
154
|
+
# Returns a list of demo files. The files returned depends on the
|
155
|
+
# +files+ attribute and if none given, then the current run mode.
|
156
|
+
def demo_files
|
157
|
+
@demo_files ||= (
|
158
|
+
if mode == :comment
|
159
|
+
demos_in_comment_mode
|
160
|
+
else
|
161
|
+
demos_in_normal_mode
|
162
|
+
end
|
163
|
+
)
|
164
|
+
end
|
165
|
+
|
166
|
+
# Collect default files to process in normal demo mode.
|
167
|
+
def demos_in_normal_mode
|
168
|
+
demos_gather(DEMO_TYPES)
|
169
|
+
end
|
170
|
+
|
171
|
+
# Collect default files to process in code comment mode.
|
172
|
+
#
|
173
|
+
# TODO: Sure removing applique files is the best approach here?
|
174
|
+
def demos_in_comment_mode
|
175
|
+
files = demos_gather(CODE_TYPES)
|
176
|
+
files = files.reject{ |f| f.index('applique/') } # don't include applique files ???
|
177
|
+
files
|
178
|
+
end
|
179
|
+
|
180
|
+
# Gather list of demo files. Uses +omit+ to remove certain files
|
181
|
+
# based on the name of their parent directory.
|
182
|
+
def demos_gather(extensions=DEMO_TYPES)
|
183
|
+
files = self.files
|
184
|
+
#files << default_location if files.empty?
|
185
|
+
files = files.map{|pattern| Dir[pattern]}.flatten.uniq
|
186
|
+
files = files.map do |file|
|
187
|
+
if File.directory?(file)
|
188
|
+
Dir[File.join(file,'**','*.{' + extensions.join(',') + '}')]
|
189
|
+
else
|
190
|
+
file
|
191
|
+
end
|
73
192
|
end
|
74
|
-
|
75
|
-
|
193
|
+
files = files.flatten.uniq
|
194
|
+
files = files.reject{ |f| f =~ Regexp.new('\/'+omit.join('|')+'\/') }
|
195
|
+
files.map{|f| File.expand_path(f) }.uniq.sort
|
76
196
|
end
|
77
197
|
|
78
198
|
# Globally applicable advice.
|
@@ -82,6 +202,108 @@ module QED
|
|
82
202
|
# end
|
83
203
|
#end
|
84
204
|
|
205
|
+
#
|
206
|
+
def self.cli(*argv)
|
207
|
+
require 'optparse'
|
208
|
+
require 'shellwords'
|
209
|
+
|
210
|
+
files, options = cli_parse(argv)
|
211
|
+
|
212
|
+
if files.empty?
|
213
|
+
puts "No files."
|
214
|
+
puts options_parser
|
215
|
+
exit -1
|
216
|
+
end
|
217
|
+
|
218
|
+
session = new(files, options)
|
219
|
+
session.run
|
220
|
+
end
|
221
|
+
|
222
|
+
# Instance of OptionParser
|
223
|
+
def self.cli_parse(argv)
|
224
|
+
options = {}
|
225
|
+
options_parser = OptionParser.new do |opt|
|
226
|
+
opt.banner = "Usage: qed [options] <files...>"
|
227
|
+
|
228
|
+
opt.separator("Custom Profiles:") unless settings.profiles.empty?
|
229
|
+
|
230
|
+
settings.profiles.each do |name, value|
|
231
|
+
o = "--#{name}"
|
232
|
+
opt.on(o, "#{name} custom profile") do
|
233
|
+
options[:profile] = name.to_sym
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
opt.separator("Report Formats (pick one):")
|
238
|
+
opt.on('--dotprogress', '-d', "use dot-progress reporter [default]") do
|
239
|
+
options[:format] = :dotprogress
|
240
|
+
end
|
241
|
+
opt.on('--verbatim', '-v', "use verbatim reporter") do
|
242
|
+
options[:format] = :verbatim
|
243
|
+
end
|
244
|
+
opt.on('--bullet', '-b', "use bullet-point reporter") do
|
245
|
+
options[:format] = :bullet
|
246
|
+
end
|
247
|
+
opt.on('--html', '-h', "use underlying HTML reporter") do
|
248
|
+
options[:format] = :html
|
249
|
+
end
|
250
|
+
#opt.on('--script', "psuedo-reporter") do
|
251
|
+
# options[:format] = :script # psuedo-reporter
|
252
|
+
#end
|
253
|
+
opt.on('--format', '-f FORMAT', "use custom reporter") do |format|
|
254
|
+
options[:format] = format.to_sym
|
255
|
+
end
|
256
|
+
|
257
|
+
opt.separator("Control Options:")
|
258
|
+
opt.on('--comment', '-c', "run comment code") do
|
259
|
+
options[:mode] = :comment
|
260
|
+
end
|
261
|
+
opt.on('--profile', '-p NAME', "load runtime profile") do |name|
|
262
|
+
options[:profile] = name
|
263
|
+
end
|
264
|
+
opt.on('--loadpath', "-I PATH", "add paths to $LOAD_PATH") do |paths|
|
265
|
+
options[:loadpath] = paths.split(/[:;]/).map{|d| File.expand_path(d)}
|
266
|
+
end
|
267
|
+
opt.on('--require', "-r LIB", "require library") do |paths|
|
268
|
+
options[:requires] = paths.split(/[:;]/)
|
269
|
+
end
|
270
|
+
opt.on('--rootless', '-R', "run from system-wide temporary directory") do
|
271
|
+
options[:rootless] = true
|
272
|
+
end
|
273
|
+
opt.on('--trace', '-t', "show full backtraces for exceptions") do
|
274
|
+
options[:trace] = true
|
275
|
+
end
|
276
|
+
opt.on('--warn', "run with warnings turned on") do
|
277
|
+
$VERBOSE = true # wish this were called $WARN!
|
278
|
+
end
|
279
|
+
opt.on('--debug', "exit immediately upon raised exception") do
|
280
|
+
$DEBUG = true
|
281
|
+
end
|
282
|
+
|
283
|
+
opt.separator("Optional Commands:")
|
284
|
+
opt.on_tail('--version', "display version") do
|
285
|
+
puts "QED #{QED::VERSION}"
|
286
|
+
exit
|
287
|
+
end
|
288
|
+
opt.on_tail('--copyright', "display copyrights") do
|
289
|
+
puts "Copyright (c) 2008 Thomas Sawyer, Apache 2.0 License"
|
290
|
+
exit
|
291
|
+
end
|
292
|
+
opt.on_tail('--help', '-h', "display this help message") do
|
293
|
+
puts opt
|
294
|
+
exit
|
295
|
+
end
|
296
|
+
end
|
297
|
+
options_parser.parse!(argv)
|
298
|
+
return argv, options
|
299
|
+
end
|
300
|
+
|
301
|
+
# TODO: Pass to Session class, instead of acting global.
|
302
|
+
# It is used at the class level to get profiles for the cli.
|
303
|
+
def self.settings
|
304
|
+
@settings ||= Settings.new
|
305
|
+
end
|
306
|
+
|
85
307
|
end#class Session
|
86
308
|
|
87
309
|
end#module QED
|