delano-tryouts 0.4.1 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.txt +10 -0
- data/README.rdoc +3 -2
- data/bin/{tryouts → sergeant} +17 -2
- data/lib/tryouts/cli/run.rb +151 -104
- data/lib/tryouts/drill/response.rb +8 -1
- data/lib/tryouts/drill/sergeant/api.rb +42 -0
- data/lib/tryouts/drill.rb +1 -0
- data/lib/tryouts/orderedhash.rb +199 -0
- data/lib/tryouts/tryout.rb +48 -26
- data/lib/tryouts.rb +26 -2
- metadata +5 -7
- data/tryouts/mockoutcli_dreams.rb +0 -19
- data/tryouts/mockoutcli_dreams.yaml +0 -10
- data/tryouts/mockoutcli_tryouts.rb +0 -27
- data/tryouts.gemspec +0 -75
data/CHANGES.txt
CHANGED
@@ -1,6 +1,16 @@
|
|
1
1
|
TRYOUTS, CHANGES
|
2
2
|
|
3
3
|
|
4
|
+
#### 0.5.0 (2009-06-07) ###############################
|
5
|
+
|
6
|
+
* FIXED: Fix for running drills without dreams and for specifying verbose without a command name
|
7
|
+
* CHANGE: The executable has been renamed to 'sergeant'
|
8
|
+
* CHANGE: Gave reality a default rcode (0)
|
9
|
+
* CHANGE: Now using module_eval (was: class_eval) for setup and clean
|
10
|
+
* ADDED: Displays percentage of failed dreams
|
11
|
+
* ADDED: Drill stash!
|
12
|
+
* ADDED: xdream and better handling for drills and dreams with no name
|
13
|
+
|
4
14
|
#### 0.4.1 (2009-06-07) ###############################
|
5
15
|
|
6
16
|
* CHANGE: The CLI output is no longer terrifyingly ugly.
|
data/README.rdoc
CHANGED
@@ -67,15 +67,16 @@ Tryouts employs the same approach for testing Ruby codes. The return value of th
|
|
67
67
|
end
|
68
68
|
|
69
69
|
|
70
|
-
==
|
70
|
+
== BETA Notice
|
71
71
|
|
72
72
|
This library is very new (est. 2009-05-19) and has not been vetted by the scrutiny of time. In particular you can expect:
|
73
73
|
|
74
|
-
* Ugly/awkward output from the tryouts executable. I wrote the core functionality that I needed to start writing tryouts for my other projects. I haven't spent very much time on reporting yet. However, this will change!
|
75
74
|
* The test definition syntax may change in future releases.
|
76
75
|
* Unexpected errors.
|
77
76
|
|
77
|
+
|
78
78
|
== 3 Ways to define tryouts
|
79
|
+
|
79
80
|
There are three ways to define an instance of this class:
|
80
81
|
* In +_tryouts.rb+ files using the DSL syntax. One file per Tryouts object.
|
81
82
|
* See: http://github.com/delano/tryouts/blob/master/tryouts/mockoutcli_tryouts.rb
|
data/bin/{tryouts → sergeant}
RENAMED
@@ -1,4 +1,4 @@
|
|
1
|
-
#!/usr/
|
1
|
+
#!/usr/bin/ruby
|
2
2
|
|
3
3
|
TRYOUTS_HOME = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
4
4
|
|
@@ -15,7 +15,7 @@ require 'tryouts/cli'
|
|
15
15
|
module TryoutsCLI
|
16
16
|
extend Drydock
|
17
17
|
|
18
|
-
debug :
|
18
|
+
debug :on
|
19
19
|
default :run, :with_args
|
20
20
|
|
21
21
|
global :q, :quiet, "Decrease output"
|
@@ -26,14 +26,29 @@ module TryoutsCLI
|
|
26
26
|
|
27
27
|
about "Run tryouts from current working directory"
|
28
28
|
argv :files
|
29
|
+
option :q, :quiet, "Decrease output (same as global)"
|
30
|
+
option :v, :verbose, "Increase output (same as global)" do
|
31
|
+
@verbose ||= 0
|
32
|
+
@verbose += 1
|
33
|
+
end
|
29
34
|
command :run => Tryouts::CLI::Run
|
30
35
|
|
31
36
|
about "Show dreams available from the current working directory"
|
32
37
|
argv :files
|
38
|
+
option :q, :quiet, "Decrease output (same as global)"
|
39
|
+
option :v, :verbose, "Increase output (same as global)" do
|
40
|
+
@verbose ||= 0
|
41
|
+
@verbose += 1
|
42
|
+
end
|
33
43
|
command :dreams => Tryouts::CLI::Run
|
34
44
|
|
35
45
|
about "Show tryouts available from the current working directory"
|
36
46
|
argv :files
|
47
|
+
option :q, :quiet, "Decrease output (same as global)"
|
48
|
+
option :v, :verbose, "Increase output (same as global)" do
|
49
|
+
@verbose ||= 0
|
50
|
+
@verbose += 1
|
51
|
+
end
|
37
52
|
command :list => Tryouts::CLI::Run
|
38
53
|
|
39
54
|
end
|
data/lib/tryouts/cli/run.rb
CHANGED
@@ -1,124 +1,171 @@
|
|
1
1
|
|
2
2
|
class Tryouts; module CLI
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
# = Run
|
5
|
+
#
|
6
|
+
# The logic bin/tryouts uses for running tryouts.
|
7
|
+
class Run < Drydock::Command
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
9
|
+
def init
|
10
|
+
@tryouts_globs = [GYMNASIUM_GLOB, File.join(Dir.pwd, '*_tryouts.rb')]
|
11
|
+
end
|
12
|
+
|
13
|
+
# $ sergeant dreams [path/2/tryouts]
|
14
|
+
# Display the dreams from all known tryouts
|
15
|
+
def dreams
|
16
|
+
load_available_tryouts_files
|
17
|
+
if @global.verbose > 0
|
18
|
+
puts Tryouts.dreams.to_yaml
|
19
|
+
else
|
20
|
+
Tryouts.dreams.each_pair do |n,dreams|
|
21
|
+
puts n
|
22
|
+
dreams.each_pair do |n, dream|
|
23
|
+
puts " " << n
|
24
|
+
dream.each_pair do |n, drill|
|
25
|
+
puts " " << n
|
25
26
|
end
|
26
27
|
end
|
27
28
|
end
|
28
29
|
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# $ sergeant run [path/2/tryouts]
|
33
|
+
# Executes all tryouts that can be found from the current working directory.
|
34
|
+
def run
|
35
|
+
if @global.verbose > 0
|
36
|
+
puts "#{Tryouts.sysinfo.to_s} (#{RUBY_VERSION})"
|
37
|
+
end
|
29
38
|
|
30
|
-
|
31
|
-
if @global.verbose > 0
|
32
|
-
puts "#{Tryouts.sysinfo.to_s} (#{RUBY_VERSION})"
|
33
|
-
end
|
34
|
-
|
35
|
-
load_available_tryouts_files
|
39
|
+
load_available_tryouts_files
|
36
40
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
end
|
41
|
+
passed, failed = 0, 0
|
42
|
+
Tryouts.instances.each_pair do |group,tryouts_inst|
|
43
|
+
puts '', ' %-60s'.att(:reverse) % group
|
44
|
+
puts " #{tryouts_inst.paths.join("\n ")}" if @global.verbose > 0
|
45
|
+
tryouts_inst.tryouts.each_pair do |name,to|
|
46
|
+
to.run
|
47
|
+
to.report
|
48
|
+
STDOUT.flush
|
49
|
+
passed += to.passed
|
50
|
+
failed += to.failed
|
48
51
|
end
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
52
|
+
end
|
53
|
+
unless @global.quiet
|
54
|
+
if (passed == 0 && failed == 0)
|
55
|
+
puts DEV if @global.verbose > 4
|
56
|
+
msg = " You didn't even try to acheive your dreams :[ "
|
57
|
+
elsif failed == 0
|
58
|
+
puts PUG if @global.verbose > 4
|
59
|
+
msg = " All %s dreams came true ".color(:green)
|
60
|
+
msg = msg % [passed+failed]
|
61
|
+
else
|
62
|
+
puts BUG if @global.verbose > 4
|
63
|
+
score = (passed.to_f / (passed.to_f+failed.to_f)) * 100
|
64
|
+
msg = " %s of %s dreams came true (%d%%) ".color(:red)
|
65
|
+
msg = msg % [passed, passed+failed, score.to_i]
|
57
66
|
end
|
67
|
+
puts $/, msg.att(:reverse)
|
58
68
|
end
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
end
|
75
|
-
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# $ sergeant list
|
72
|
+
# Displays all known tryouts from the current working directory
|
73
|
+
def list
|
74
|
+
load_available_tryouts_files
|
75
|
+
Tryouts.instances.each_pair do |n,tryouts_inst|
|
76
|
+
puts n
|
77
|
+
if @global.verbose > 0
|
78
|
+
puts " #{tryouts_inst.paths.join("\n ")}"
|
79
|
+
end
|
80
|
+
tryouts_inst.tryouts.each_pair do |t2,tryout|
|
81
|
+
puts " " << tryout.name
|
82
|
+
tryout.drills.each do |drill|
|
83
|
+
puts " " << drill.name
|
76
84
|
end
|
77
|
-
|
85
|
+
end
|
78
86
|
end
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
87
|
+
end
|
88
|
+
|
89
|
+
private
|
90
|
+
|
91
|
+
# Find and load all tryouts files
|
92
|
+
def load_available_tryouts_files
|
93
|
+
@tryouts_files = []
|
94
|
+
# If file paths were given, check those only.
|
95
|
+
unless @argv.empty?
|
96
|
+
@argv.each do |file|
|
97
|
+
file = File.join(file, '**', '*_tryouts.rb') if File.directory?(file)
|
98
|
+
@tryouts_files += Dir.glob file
|
99
|
+
end
|
100
|
+
# Otherwise check the default globs
|
101
|
+
else
|
102
|
+
@tryouts_globs.each do |glob|
|
103
|
+
@tryouts_files += Dir.glob glob
|
94
104
|
end
|
95
|
-
@tryouts_files.uniq! # Don't load the same file twice
|
96
|
-
@tryouts_files.each { |f| puts "LOADING: #{f}"} if @global.verbose > 0
|
97
|
-
@tryouts_files.each { |file| Tryouts.parse_file file }
|
98
105
|
end
|
106
|
+
@tryouts_files.uniq! # Don't load the same file twice
|
107
|
+
@tryouts_files.each { |f| puts "LOADING: #{f}"} if @global.verbose > 0
|
108
|
+
@tryouts_files.each { |file| Tryouts.parse_file file }
|
99
109
|
end
|
110
|
+
end
|
100
111
|
end; end
|
101
112
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
113
|
+
class Tryouts::CLI::Run
|
114
|
+
DEV = %q{
|
115
|
+
^^ @@@@@@@@@
|
116
|
+
^^ ^^ @@@@@@@@@@@@@@@
|
117
|
+
@@@@@@@@@@@@@@@@@@ ^^
|
118
|
+
@@@@@@@@@@@@@@@@@@@@
|
119
|
+
~~~ ~~~~~~~~ ~~ &&&&&&&&&&&&&&&&&&&& ~~~~~~~ ~~~~~~~~~~~ ~~
|
120
|
+
~~ ~ ~ ~~~~~~~~~~~~~~~~~~~~ ~ ~~ ~~ ~
|
121
|
+
~ ~~ ~~ ~~ ~~~~~~~~~~~~~ ~~~~ ~ ~~~ ~ ~~~ ~
|
122
|
+
~ ~ ~~~~~~ ~~ ~~~ ~~ ~ ~~ ~~ ~
|
123
|
+
~ ~ ~ ~~ ~~~~~~ ~ ~~ ~ ~~~
|
124
|
+
~ ~ ~ ~~ ~ ~
|
125
|
+
}
|
126
|
+
BUG = %q{
|
127
|
+
,--.____ ____.--.
|
128
|
+
/ .'.'"``--...----------.___.----------...--''"`.`. \
|
129
|
+
| .'.' . . `.`. |
|
130
|
+
`. .'| . ' - . _ `-----' _ . - ' . |`. .'
|
131
|
+
`.' `| .' _ "-._ _.-" _ `. |' `.'
|
132
|
+
| | " -. .- " | |
|
133
|
+
\| ;;.. "|i. .i|" ..;; |/
|
134
|
+
`| ,---.``. ' ' .'',---. |'
|
135
|
+
| <'(__.'>.'---` '---`.<`.__)`> |
|
136
|
+
| `. `~ .' ,-------. `. ~'.' |
|
137
|
+
| |=_"`=.' . `-.___.-' . `.='"_=| |
|
138
|
+
| | ==/ : ` : i : ' : \== | |
|
139
|
+
| | ==/ /\___|___/\ \== | |
|
140
|
+
`.| =Y .' """_""" `. Y= |.'
|
141
|
+
L || ; .=="==. ; || J
|
142
|
+
\ ; .' ' ` `. ; /
|
143
|
+
`. ; ; .'
|
144
|
+
; ;'\ /`; ;
|
145
|
+
`; .'.'/. ,\`.`. ;'
|
146
|
+
`-=;_-' `-----' `-_;=-' -bodom-
|
147
|
+
}
|
148
|
+
PUG = %q{
|
149
|
+
__,-----._ ,-.
|
150
|
+
,' ,-. \`---. ,-----<._/
|
151
|
+
(,.-. o:.` )),"\\\-._ ,' `.
|
152
|
+
('"-` .\ \`:_ )\ `-;'-._ \
|
153
|
+
,,-. \` ; : \( `-' ) -._ : `:
|
154
|
+
( \ `._\\\ ` ; ; ` : )
|
155
|
+
\`. `-. __ , / \ ;, (
|
156
|
+
`.`-.___--' `- / ; | : |
|
157
|
+
`-' `-.`--._ ' ; |
|
158
|
+
(`--._`. ; /\ |
|
159
|
+
\ ' \ , ) :
|
160
|
+
| `--::---- \' ; ;|
|
161
|
+
\ .__,- ( ) : :|
|
162
|
+
\ : `------; \ | | ;
|
163
|
+
\ : / , ) | | (
|
164
|
+
\ \ `-^-| | / , ,\
|
165
|
+
) ) | -^- ; `-^-^'
|
166
|
+
_,' _ ; | |
|
167
|
+
/ , , ,' /---. :
|
168
|
+
`-^-^' ( : :,'
|
169
|
+
`-^--' -hrr-
|
170
|
+
}
|
171
|
+
end
|
@@ -100,6 +100,13 @@ class Tryouts::Drill
|
|
100
100
|
#
|
101
101
|
# Contains the actual response of a Drill
|
102
102
|
#
|
103
|
-
class Reality < Tryouts::Drill::Response
|
103
|
+
class Reality < Tryouts::Drill::Response
|
104
|
+
# An ordered hash taken from the DrillContext that created this Reality.
|
105
|
+
attr_accessor :stash
|
106
|
+
def initialize
|
107
|
+
@rcode = 0
|
108
|
+
@stash = Tryouts::HASH_TYPE.new
|
109
|
+
end
|
110
|
+
end
|
104
111
|
|
105
112
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
|
4
|
+
class Tryouts; class Drill; module Sergeant
|
5
|
+
|
6
|
+
# = API
|
7
|
+
#
|
8
|
+
# The sergeant responsible for running Ruby code (API) drills.
|
9
|
+
#
|
10
|
+
class API
|
11
|
+
|
12
|
+
# +return_value+ specify a return value. This will be
|
13
|
+
# used if no block is specified for the drill.
|
14
|
+
def initialize(return_value=nil)
|
15
|
+
@return_value = return_value
|
16
|
+
end
|
17
|
+
|
18
|
+
def run(block, context, &inline)
|
19
|
+
|
20
|
+
# A Proc object takes precedence over an inline block.
|
21
|
+
runtime = (block.nil? ? inline : block)
|
22
|
+
response = Tryouts::Drill::Reality.new
|
23
|
+
if runtime.nil?
|
24
|
+
response.output = @return_value
|
25
|
+
else
|
26
|
+
begin
|
27
|
+
unless runtime.nil?
|
28
|
+
ret = context.instance_eval &runtime
|
29
|
+
response.output, response.rcode = ret, 0
|
30
|
+
end
|
31
|
+
rescue => ex
|
32
|
+
response.rcode = 1
|
33
|
+
response.output = ret
|
34
|
+
response.emsg = ex.message
|
35
|
+
response.backtrace = ex.backtrace
|
36
|
+
end
|
37
|
+
end
|
38
|
+
response
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end; end; end
|
data/lib/tryouts/drill.rb
CHANGED
@@ -0,0 +1,199 @@
|
|
1
|
+
# AUTHOR
|
2
|
+
# jan molic /mig/at/1984/dot/cz/
|
3
|
+
#
|
4
|
+
# DESCRIPTION
|
5
|
+
# Hash with preserved order and some array-like extensions
|
6
|
+
# Public domain.
|
7
|
+
#
|
8
|
+
# THANKS
|
9
|
+
# Andrew Johnson for his suggestions and fixes of Hash[],
|
10
|
+
# merge, to_a, inspect and shift
|
11
|
+
class Tryouts::OrderedHash < ::Hash
|
12
|
+
attr_accessor :order
|
13
|
+
|
14
|
+
class << self
|
15
|
+
def [] *args
|
16
|
+
hsh = Tryouts::OrderedHash.new
|
17
|
+
if Hash === args[0]
|
18
|
+
hsh.replace args[0]
|
19
|
+
elsif (args.size % 2) != 0
|
20
|
+
raise ArgumentError, "odd number of elements for Hash"
|
21
|
+
else
|
22
|
+
0.step(args.size - 1, 2) do |a|
|
23
|
+
b = a + 1
|
24
|
+
hsh[args[a]] = args[b]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
hsh
|
28
|
+
end
|
29
|
+
end
|
30
|
+
def initialize(*a, &b)
|
31
|
+
super
|
32
|
+
@order = []
|
33
|
+
end
|
34
|
+
def store_only a,b
|
35
|
+
store a,b
|
36
|
+
end
|
37
|
+
alias orig_store store
|
38
|
+
def store a,b
|
39
|
+
@order.push a unless has_key? a
|
40
|
+
super a,b
|
41
|
+
end
|
42
|
+
alias []= store
|
43
|
+
def == hsh2
|
44
|
+
return false if @order != hsh2.order
|
45
|
+
super hsh2
|
46
|
+
end
|
47
|
+
def clear
|
48
|
+
@order = []
|
49
|
+
super
|
50
|
+
end
|
51
|
+
def delete key
|
52
|
+
@order.delete key
|
53
|
+
super
|
54
|
+
end
|
55
|
+
def each_key
|
56
|
+
@order.each { |k| yield k }
|
57
|
+
self
|
58
|
+
end
|
59
|
+
def each_value
|
60
|
+
@order.each { |k| yield self[k] }
|
61
|
+
self
|
62
|
+
end
|
63
|
+
def each
|
64
|
+
@order.each { |k| yield k,self[k] }
|
65
|
+
self
|
66
|
+
end
|
67
|
+
alias each_pair each
|
68
|
+
def delete_if
|
69
|
+
@order.clone.each { |k|
|
70
|
+
delete k if yield(k)
|
71
|
+
}
|
72
|
+
self
|
73
|
+
end
|
74
|
+
def values
|
75
|
+
ary = []
|
76
|
+
@order.each { |k| ary.push self[k] }
|
77
|
+
ary
|
78
|
+
end
|
79
|
+
def keys
|
80
|
+
@order
|
81
|
+
end
|
82
|
+
def first
|
83
|
+
{@order.first => self[@order.first]}
|
84
|
+
end
|
85
|
+
def last
|
86
|
+
{@order.last => self[@order.last]}
|
87
|
+
end
|
88
|
+
def invert
|
89
|
+
hsh2 = Hash.new
|
90
|
+
@order.each { |k| hsh2[self[k]] = k }
|
91
|
+
hsh2
|
92
|
+
end
|
93
|
+
def reject &block
|
94
|
+
self.dup.delete_if &block
|
95
|
+
end
|
96
|
+
def reject! &block
|
97
|
+
hsh2 = reject &block
|
98
|
+
self == hsh2 ? nil : hsh2
|
99
|
+
end
|
100
|
+
def replace hsh2
|
101
|
+
@order = hsh2.keys
|
102
|
+
super hsh2
|
103
|
+
end
|
104
|
+
def shift
|
105
|
+
key = @order.first
|
106
|
+
key ? [key,delete(key)] : super
|
107
|
+
end
|
108
|
+
def unshift k,v
|
109
|
+
unless self.include? k
|
110
|
+
@order.unshift k
|
111
|
+
orig_store(k,v)
|
112
|
+
true
|
113
|
+
else
|
114
|
+
false
|
115
|
+
end
|
116
|
+
end
|
117
|
+
def push k,v
|
118
|
+
unless self.include? k
|
119
|
+
@order.push k
|
120
|
+
orig_store(k,v)
|
121
|
+
true
|
122
|
+
else
|
123
|
+
false
|
124
|
+
end
|
125
|
+
end
|
126
|
+
def pop
|
127
|
+
key = @order.last
|
128
|
+
key ? [key,delete(key)] : nil
|
129
|
+
end
|
130
|
+
def to_a
|
131
|
+
ary = []
|
132
|
+
each { |k,v| ary << [k,v] }
|
133
|
+
ary
|
134
|
+
end
|
135
|
+
def to_s
|
136
|
+
self.to_a.to_s
|
137
|
+
end
|
138
|
+
def inspect
|
139
|
+
ary = []
|
140
|
+
each {|k,v| ary << k.inspect + "=>" + v.inspect}
|
141
|
+
'{' + ary.join(", ") + '}'
|
142
|
+
end
|
143
|
+
def update hsh2
|
144
|
+
hsh2.each { |k,v| self[k] = v }
|
145
|
+
self
|
146
|
+
end
|
147
|
+
alias :merge! update
|
148
|
+
def merge hsh2
|
149
|
+
##self.dup update(hsh2) ## 2009-05-12 -- delano
|
150
|
+
update hsh2 ## dup doesn't take an argument
|
151
|
+
## and there's no need for it here
|
152
|
+
end
|
153
|
+
def select
|
154
|
+
ary = []
|
155
|
+
each { |k,v| ary << [k,v] if yield k,v }
|
156
|
+
ary
|
157
|
+
end
|
158
|
+
def class
|
159
|
+
Hash
|
160
|
+
end
|
161
|
+
def __class__
|
162
|
+
Tryouts::OrderedHash
|
163
|
+
end
|
164
|
+
|
165
|
+
attr_accessor "to_yaml_style"
|
166
|
+
def yaml_inline= bool
|
167
|
+
if respond_to?("to_yaml_style")
|
168
|
+
self.to_yaml_style = :inline
|
169
|
+
else
|
170
|
+
unless defined? @__yaml_inline_meth
|
171
|
+
@__yaml_inline_meth =
|
172
|
+
lambda {|opts|
|
173
|
+
YAML::quick_emit(object_id, opts) {|emitter|
|
174
|
+
emitter << '{ ' << map{|kv| kv.join ': '}.join(', ') << ' }'
|
175
|
+
}
|
176
|
+
}
|
177
|
+
class << self
|
178
|
+
def to_yaml opts = {}
|
179
|
+
begin
|
180
|
+
@__yaml_inline ? @__yaml_inline_meth[ opts ] : super
|
181
|
+
rescue
|
182
|
+
@to_yaml_style = :inline
|
183
|
+
super
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
@__yaml_inline = bool
|
190
|
+
end
|
191
|
+
def yaml_inline!() self.yaml_inline = true end
|
192
|
+
|
193
|
+
def each_with_index
|
194
|
+
@order.each_with_index { |k, index| yield k, self[k], index }
|
195
|
+
self
|
196
|
+
end
|
197
|
+
end # class Tryouts::OrderedHash
|
198
|
+
|
199
|
+
|
data/lib/tryouts/tryout.rb
CHANGED
@@ -34,7 +34,25 @@ class Tryouts
|
|
34
34
|
# Each Drill is executed in a new instance of this class. That means
|
35
35
|
# instance variables are not carried through, but class variables are.
|
36
36
|
# The before and after blocks are also run in this context.
|
37
|
-
class DrillContext
|
37
|
+
class DrillContext
|
38
|
+
# An ordered Hash of stashed objects.
|
39
|
+
attr_reader :stash
|
40
|
+
def initialize; @stash = Tryouts::HASH_TYPE.new; end
|
41
|
+
# If called with no arguments, returns +@stash+.
|
42
|
+
# If called with arguments, it will add a new value to the +@stash+
|
43
|
+
# and return the new value. e.g.
|
44
|
+
#
|
45
|
+
# stash :name, 'some value' # => 'some value'
|
46
|
+
#
|
47
|
+
def stash(*args)
|
48
|
+
if args.empty?
|
49
|
+
@stash
|
50
|
+
else
|
51
|
+
@stash[args[0]] = args[1]
|
52
|
+
args[1]
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
38
56
|
|
39
57
|
def initialize(name, dtype, command=nil, *args)
|
40
58
|
raise "Must supply command for dtype :cli" if dtype == :cli && command.nil?
|
@@ -56,13 +74,16 @@ class Tryouts
|
|
56
74
|
# Execute all Drill objects
|
57
75
|
def run
|
58
76
|
update_drills! # Ensure all drills have all known dreams
|
59
|
-
DrillContext.
|
77
|
+
DrillContext.module_eval &setup if setup.is_a?(Proc)
|
60
78
|
puts Tryouts::TRYOUT_MSG.bright % @name
|
61
79
|
@drills.each do |drill|
|
62
80
|
drill.run(DrillContext.new) # Returns true or false
|
81
|
+
drill.reality.stash.each_pair do |n,v|
|
82
|
+
puts '%14s: %s' % [n,v.inspect]
|
83
|
+
end
|
63
84
|
drill.success? ? @passed += 1 : @failed += 1
|
64
85
|
end
|
65
|
-
DrillContext.
|
86
|
+
DrillContext.module_eval &clean if clean.is_a?(Proc)
|
66
87
|
end
|
67
88
|
|
68
89
|
# Prints error output. If there are no errors, it prints nothing.
|
@@ -70,7 +91,7 @@ class Tryouts
|
|
70
91
|
return true if success?
|
71
92
|
failed = @drills.select { |d| !d.success? }
|
72
93
|
failed.each_with_index do |drill,index|
|
73
|
-
title = ' %-59s' % %Q{ERROR #{index+1}/#{failed.size}
|
94
|
+
title = ' %-59s' % %Q{ERROR #{index+1}/#{failed.size} "#{drill.name}"}
|
74
95
|
puts $/, ' ' << title.color(:red).att(:reverse)
|
75
96
|
|
76
97
|
if drill.dream
|
@@ -81,17 +102,13 @@ class Tryouts
|
|
81
102
|
puts '%24s: %s' % ["expected error msg", drill.dream.emsg.inspect]
|
82
103
|
puts '%24s: %s' % ["actual error msg", drill.reality.emsg.inspect]
|
83
104
|
end
|
84
|
-
|
85
|
-
puts '%24s' % ["[nodream]"]
|
105
|
+
|
86
106
|
if drill.reality.rcode > 0
|
87
|
-
puts '%24s:
|
88
|
-
puts
|
107
|
+
puts '%24s: ' % ["backtrace"]
|
108
|
+
puts drill.reality.backtrace, $/
|
89
109
|
end
|
90
|
-
|
91
|
-
|
92
|
-
if drill.reality.rcode > 0
|
93
|
-
puts '%24s: ' % ["backtrace"]
|
94
|
-
puts drill.reality.backtrace, $/
|
110
|
+
else
|
111
|
+
puts '%24s' % ["[nodream]"]
|
95
112
|
end
|
96
113
|
|
97
114
|
end
|
@@ -141,31 +158,36 @@ class Tryouts
|
|
141
158
|
@clean = block
|
142
159
|
end
|
143
160
|
|
161
|
+
# Create and add a Drill object to the list for this Tryout
|
162
|
+
# +name+ is the name of the drill.
|
163
|
+
# +args+ is sent directly to the Drill class. The values are specific on the Sergeant.
|
164
|
+
def drill(dname, *args, &definition)
|
165
|
+
raise "Empty drill name (#{@name})" if dname.nil? || dname.empty?
|
166
|
+
args.unshift(@command) if @dtype == :cli
|
167
|
+
drill = Tryouts::Drill.new(dname, @dtype, *args, &definition)
|
168
|
+
add_drill drill
|
169
|
+
end
|
170
|
+
# A quick way to comment out a drill
|
171
|
+
def xdrill(*args, &b); end # ignore calls to xdrill
|
172
|
+
|
144
173
|
# +name+ of the Drill associated to this Dream
|
145
174
|
# +output+ A String or Array of expected output. A Dream object will be created using this value (optional)
|
146
175
|
# +definition+ is a block which will be run on an instance of Dream
|
147
176
|
#
|
148
177
|
# NOTE: This method is DSL-only. It's not intended to be used in OO syntax.
|
149
|
-
def dream(
|
178
|
+
def dream(dname, output=nil, format=nil, rcode=0, emsg=nil, &definition)
|
179
|
+
raise "Empty dream name (#{@name})" if dname.nil? || dname.empty?
|
150
180
|
if output.nil?
|
181
|
+
raise "No output or block for '#{dname}' (#{@name})" if definition.nil?
|
151
182
|
dobj = Tryouts::Drill::Dream.from_block definition
|
152
183
|
else
|
153
184
|
dobj = Tryouts::Drill::Dream.new(output)
|
154
185
|
dobj.format, dobj.rcode, dobj.emsg = format, rcode, emsg
|
155
186
|
end
|
156
|
-
@dreams[
|
187
|
+
@dreams[dname] = dobj
|
157
188
|
dobj
|
158
189
|
end
|
159
|
-
|
160
|
-
|
161
|
-
# +name+ is the name of the drill.
|
162
|
-
# +args+ is sent directly to the Drill class. The values are specific on the Sergeant.
|
163
|
-
def drill(name, *args, &definition)
|
164
|
-
args.unshift(@command) if @dtype == :cli
|
165
|
-
drill = Tryouts::Drill.new(name, @dtype, *args, &definition)
|
166
|
-
add_drill drill
|
167
|
-
end
|
168
|
-
def xdrill(*args, &b); end # ignore calls to xdrill
|
169
|
-
|
190
|
+
# A quick way to comment out a dream
|
191
|
+
def xdream(*args, &b); end
|
170
192
|
|
171
193
|
end; end
|
data/lib/tryouts.rb
CHANGED
@@ -30,7 +30,7 @@ class Tryouts
|
|
30
30
|
# Raised when there is a problem loading or parsing a Tryouts::Drill::Dream object
|
31
31
|
class BadDreams < Exception; end
|
32
32
|
|
33
|
-
VERSION = "0.
|
33
|
+
VERSION = "0.5.0"
|
34
34
|
|
35
35
|
require 'tryouts/mixins'
|
36
36
|
require 'tryouts/tryout'
|
@@ -119,7 +119,6 @@ class Tryouts
|
|
119
119
|
@@instances.last.command(*args)
|
120
120
|
end
|
121
121
|
|
122
|
-
|
123
122
|
# Require +name+. If +path+ is supplied, it will "require path".
|
124
123
|
# * +name+ The name of the library in question (required). Stored as a Symbol to +@library+.
|
125
124
|
# * +path+ Add a path to the front of $LOAD_PATH (optional). Use this if you want to load
|
@@ -165,6 +164,9 @@ class Tryouts
|
|
165
164
|
return if name.nil?
|
166
165
|
dtype ||= @dtype
|
167
166
|
command ||= @command if dtype == :cli
|
167
|
+
|
168
|
+
raise "No drill type specified for #{name}." if dtype.nil?
|
169
|
+
|
168
170
|
to = find_tryout(name, dtype)
|
169
171
|
if to.nil?
|
170
172
|
to = Tryouts::Tryout.new(name, dtype, command)
|
@@ -261,6 +263,19 @@ class Tryouts
|
|
261
263
|
end
|
262
264
|
end
|
263
265
|
|
266
|
+
# Returns +@tryouts+.
|
267
|
+
#
|
268
|
+
# Also acts as a stub for Tryouts#tryout in case someone
|
269
|
+
# specifies "tryouts 'name' do ..." in the DSL.
|
270
|
+
def tryouts(*args, &block)
|
271
|
+
return tryout(*args, &block) unless args.empty?
|
272
|
+
@tryouts
|
273
|
+
end
|
274
|
+
# An alias for Tryouts.tryout.
|
275
|
+
def self.tryouts(*args, &block)
|
276
|
+
tryout(args, &block)
|
277
|
+
end
|
278
|
+
|
264
279
|
# +name+ of the Drill associated to this Dream
|
265
280
|
# +output+ A String or Array of expected output. A Dream object will be created using this value (optional)
|
266
281
|
# +definition+ is a block which will be run on an instance of Dream
|
@@ -295,6 +310,15 @@ class Tryouts
|
|
295
310
|
@@instances.last.dream(*args, &block)
|
296
311
|
end
|
297
312
|
|
313
|
+
# This method does nothing. It provides a quick way to disable a dream.
|
314
|
+
#
|
315
|
+
# NOTE: This is a DSL-only method and is not intended for OO use.
|
316
|
+
def xdream(*args, &block); end
|
317
|
+
# This method does nothing. It provides a quick way to disable a dream.
|
318
|
+
#
|
319
|
+
# NOTE: this is a standalone DSL-syntax method.
|
320
|
+
def self.xdream(*args, &block); end
|
321
|
+
|
298
322
|
# Populate @@dreams with the content of the file +dpath+.
|
299
323
|
#
|
300
324
|
# NOTE: this is an OO syntax method
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: delano-tryouts
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Delano Mandelbaum
|
@@ -55,7 +55,7 @@ dependencies:
|
|
55
55
|
description: Tryouts are high-level tests for your Ruby code. May all your dreams come true!
|
56
56
|
email: tryouts@solutious.com
|
57
57
|
executables:
|
58
|
-
-
|
58
|
+
- sergeant
|
59
59
|
extensions: []
|
60
60
|
|
61
61
|
extra_rdoc_files:
|
@@ -67,20 +67,18 @@ files:
|
|
67
67
|
- README.rdoc
|
68
68
|
- Rakefile
|
69
69
|
- bin/mockout
|
70
|
-
- bin/
|
70
|
+
- bin/sergeant
|
71
71
|
- lib/tryouts.rb
|
72
72
|
- lib/tryouts/cli.rb
|
73
73
|
- lib/tryouts/cli/run.rb
|
74
74
|
- lib/tryouts/drill.rb
|
75
75
|
- lib/tryouts/drill/response.rb
|
76
|
+
- lib/tryouts/drill/sergeant/api.rb
|
76
77
|
- lib/tryouts/drill/sergeant/cli.rb
|
77
78
|
- lib/tryouts/mixins.rb
|
78
79
|
- lib/tryouts/mixins/hash.rb
|
80
|
+
- lib/tryouts/orderedhash.rb
|
79
81
|
- lib/tryouts/tryout.rb
|
80
|
-
- tryouts.gemspec
|
81
|
-
- tryouts/mockoutcli_dreams.rb
|
82
|
-
- tryouts/mockoutcli_dreams.yaml
|
83
|
-
- tryouts/mockoutcli_tryouts.rb
|
84
82
|
has_rdoc: true
|
85
83
|
homepage: http://github.com/delano/tryouts
|
86
84
|
post_install_message:
|
@@ -1,19 +0,0 @@
|
|
1
|
-
|
2
|
-
dreams "Common Usage" do
|
3
|
-
dream "No args" do
|
4
|
-
output inline(%Q{
|
5
|
-
Date: 2009-02-16
|
6
|
-
Owners: greg, rupaul, telly, prince kinko
|
7
|
-
Players: d-bam, alberta, birds, condor man
|
8
|
-
})
|
9
|
-
end
|
10
|
-
dream "YAML Output" do
|
11
|
-
format :to_yaml
|
12
|
-
output ({
|
13
|
-
"Date" => "2009-02-16",
|
14
|
-
"Players" => ["d-bam", "alberta", "birds", "condor man"],
|
15
|
-
"Owners" => ["greg", "rupaul", "telly", "prince kinko"]
|
16
|
-
})
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
@@ -1,27 +0,0 @@
|
|
1
|
-
|
2
|
-
TRYOUTS_HOME = File.expand_path(File.join(File.dirname(__FILE__), ".."))
|
3
|
-
MOCKOUT_PATH = File.join(TRYOUTS_HOME, "bin", "mockout")
|
4
|
-
|
5
|
-
group "mockout cli"
|
6
|
-
command :mockout, MOCKOUT_PATH
|
7
|
-
dreams File.join(GYMNASIUM_HOME, 'mockoutcli_dreams.rb')
|
8
|
-
|
9
|
-
tryout "Common Usage" do
|
10
|
-
drill "No Command"
|
11
|
-
drill "No args", :info
|
12
|
-
drill "YAML Output", :f, :yaml, :info
|
13
|
-
drill "JSON Output", :f, :json, :info
|
14
|
-
end
|
15
|
-
|
16
|
-
tryout "inline dream that passes", :cli, :mockout do
|
17
|
-
output = ["we expect mockout to", "echo these lines back"]
|
18
|
-
|
19
|
-
# $ bin/mockout sergeant -e "we expect mockout to" "echo these lines back"
|
20
|
-
drill "echo arguments", :info, :e, output[0], output[1]
|
21
|
-
dream "echo arguments", output
|
22
|
-
end
|
23
|
-
|
24
|
-
tryout "inline dream that fails", :cli, :mockout do
|
25
|
-
dream "echo arguments", "The dream does"
|
26
|
-
drill "echo arguments", :info, :e, "not match reality"
|
27
|
-
end
|
data/tryouts.gemspec
DELETED
@@ -1,75 +0,0 @@
|
|
1
|
-
@spec = Gem::Specification.new do |s|
|
2
|
-
s.name = "tryouts"
|
3
|
-
s.rubyforge_project = "tryouts"
|
4
|
-
s.version = "0.4.1"
|
5
|
-
s.summary = "Tryouts are high-level tests for your Ruby code. May all your dreams come true!"
|
6
|
-
s.description = s.summary
|
7
|
-
s.author = "Delano Mandelbaum"
|
8
|
-
s.email = "tryouts@solutious.com"
|
9
|
-
s.homepage = "http://github.com/delano/tryouts"
|
10
|
-
|
11
|
-
# = EXECUTABLES =
|
12
|
-
# The list of executables in your project (if any). Don't include the path,
|
13
|
-
# just the base filename.
|
14
|
-
s.executables = %w[tryouts]
|
15
|
-
|
16
|
-
# Directories to extract rdocs from
|
17
|
-
s.require_paths = %w[lib]
|
18
|
-
|
19
|
-
# Specific files to include rdocs from
|
20
|
-
s.extra_rdoc_files = %w[README.rdoc LICENSE.txt]
|
21
|
-
|
22
|
-
# Update --main to reflect the default page to display
|
23
|
-
s.rdoc_options = ["--line-numbers", "--title", "Tryouts: #{s.summary}", "--main", "README.rdoc"]
|
24
|
-
|
25
|
-
# = DEPENDENCIES =
|
26
|
-
# Add all gem dependencies
|
27
|
-
s.add_dependency 'drydock', '>= 0.6.5'
|
28
|
-
s.add_dependency 'rye', '>= 0.6.6'
|
29
|
-
s.add_dependency 'sysinfo', '>= 0.5.1'
|
30
|
-
|
31
|
-
# = MANIFEST =
|
32
|
-
# The complete list of files to be included in the release. When GitHub packages your gem,
|
33
|
-
# it doesn't allow you to run any command that accesses the filesystem. You will get an
|
34
|
-
# error. You can ask your VCS for the list of versioned files:
|
35
|
-
# git ls-files
|
36
|
-
# svn list -R
|
37
|
-
s.files = %w(
|
38
|
-
CHANGES.txt
|
39
|
-
LICENSE.txt
|
40
|
-
README.rdoc
|
41
|
-
Rakefile
|
42
|
-
bin/mockout
|
43
|
-
bin/tryouts
|
44
|
-
lib/tryouts.rb
|
45
|
-
lib/tryouts/cli.rb
|
46
|
-
lib/tryouts/cli/run.rb
|
47
|
-
lib/tryouts/drill.rb
|
48
|
-
lib/tryouts/drill/response.rb
|
49
|
-
lib/tryouts/drill/sergeant/cli.rb
|
50
|
-
lib/tryouts/mixins.rb
|
51
|
-
lib/tryouts/mixins/hash.rb
|
52
|
-
lib/tryouts/tryout.rb
|
53
|
-
tryouts.gemspec
|
54
|
-
tryouts/mockoutcli_dreams.rb
|
55
|
-
tryouts/mockoutcli_dreams.yaml
|
56
|
-
tryouts/mockoutcli_tryouts.rb
|
57
|
-
)
|
58
|
-
|
59
|
-
s.has_rdoc = true
|
60
|
-
s.rubygems_version = '1.3.0'
|
61
|
-
|
62
|
-
if s.respond_to? :specification_version then
|
63
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
64
|
-
s.specification_version = 2
|
65
|
-
|
66
|
-
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
67
|
-
s.add_runtime_dependency(%q<RedCloth>, [">= 4.0.4"])
|
68
|
-
else
|
69
|
-
s.add_dependency(%q<RedCloth>, [">= 4.0.4"])
|
70
|
-
end
|
71
|
-
else
|
72
|
-
s.add_dependency(%q<RedCloth>, [">= 4.0.4"])
|
73
|
-
end
|
74
|
-
|
75
|
-
end
|