dchelimsky-rspec 1.1.11.4 → 1.1.11.5
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/History.txt +4 -2
- data/Manifest.txt +7 -3
- data/Rakefile +1 -1
- data/examples/ruby1.9.compatibility/access_to_constants_spec.rb +86 -0
- data/features/before_and_after_blocks/before_and_after_blocks.feature +168 -0
- data/features/step_definitions/running_rspec.rb +7 -1
- data/lib/spec.rb +1 -0
- data/lib/spec/dsl/main.rb +2 -1
- data/lib/spec/example/before_and_after_hooks.rb +20 -2
- data/lib/spec/example/example_group_factory.rb +11 -0
- data/lib/spec/example/example_group_methods.rb +32 -35
- data/lib/spec/example/shared_example_group.rb +0 -4
- data/lib/spec/matchers/respond_to.rb +1 -2
- data/lib/spec/matchers/wrap_expectation.rb +1 -1
- data/lib/spec/mocks/proxy.rb +1 -1
- data/lib/spec/ruby.rb +9 -0
- data/lib/spec/runner/configuration.rb +6 -7
- data/lib/spec/runner/formatter/nested_text_formatter.rb +2 -2
- data/lib/spec/runner/heckle_runner.rb +58 -56
- data/lib/spec/runner/options.rb +9 -4
- data/lib/spec/version.rb +1 -1
- data/rspec.gemspec +5 -5
- data/spec/spec/dsl/main_spec.rb +21 -1
- data/spec/spec/example/example_group_methods_spec.rb +51 -0
- data/spec/spec/example/example_methods_spec.rb +1 -33
- data/spec/spec/matchers/have_spec.rb +2 -2
- data/spec/spec/mocks/nil_expectation_warning_spec.rb +1 -1
- data/spec/spec/mocks/stub_spec.rb +6 -0
- data/spec/spec/runner/configuration_spec.rb +11 -0
- data/spec/spec/runner/drb_command_line_spec.rb +4 -4
- data/spec/spec/runner/formatter/base_text_formatter_spec.rb +1 -0
- data/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +5 -5
- data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +3 -3
- data/spec/spec/runner/formatter/html_formatted-1.8.6.html +24 -24
- data/spec/spec/runner/formatter/html_formatted-1.8.7.html +379 -0
- data/spec/spec/runner/formatter/html_formatted-1.9.1.html +379 -0
- data/spec/spec/runner/formatter/html_formatter_spec.rb +9 -13
- data/spec/spec/runner/formatter/nested_text_formatter_spec.rb +4 -4
- data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +3 -3
- data/spec/spec/runner/formatter/spec_mate_formatter_spec.rb +8 -12
- data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +4 -4
- data/spec/spec/runner/formatter/text_mate_formatted-1.8.6.html +18 -18
- data/spec/spec/runner/formatter/text_mate_formatted-1.8.7.html +373 -0
- data/spec/spec/runner/formatter/text_mate_formatted-1.9.1.html +373 -0
- data/spec/spec/runner/heckler_spec.rb +16 -9
- data/spec/spec/runner/option_parser_spec.rb +0 -2
- data/spec/spec/runner/options_spec.rb +7 -2
- data/spec/spec/runner/reporter_spec.rb +4 -4
- data/spec/spec_helper.rb +4 -0
- metadata +10 -6
- data/features/configuration/before_blocks.feature +0 -21
- data/resources/spec/before_blocks_example.rb +0 -32
- data/spec/spec/example/example_runner_spec.rb +0 -194
data/History.txt
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
* hash_including mock argument matcher can now accept just keys, key/value pairs, or both (David Krmpotic)
|
15
15
|
* added hash_not_including mock argument matcher (David Krmpotic). Closes #634.
|
16
16
|
|
17
|
-
*
|
17
|
+
* 7 minor enhancements
|
18
18
|
|
19
19
|
* should throw_symbol accepts an optional argument: should throw_symbol(:sym, arg)
|
20
20
|
* fixed --line for jruby (Zach Moazeni)
|
@@ -22,8 +22,9 @@
|
|
22
22
|
* removed all instances of class << self - I do know who I am
|
23
23
|
* SpecParser can't handle backtrace paths with colons (John-Mason P. Shackelford). Closes #505.
|
24
24
|
* html formatter (and subsequently the textmate formatter) header fills in completely when running a single example
|
25
|
+
* config.include now accepts an array of types (config.include(Helpers, :type => [:view, :controller]))
|
25
26
|
|
26
|
-
*
|
27
|
+
* 9 bug fixes
|
27
28
|
|
28
29
|
* fixed bug where {:a => 1, :b => 2}.should include(:a, :b) failed (Yossef Mendelssohn)
|
29
30
|
* only try to load Test::Unit if Test::Unit is defined (not just Test)
|
@@ -33,6 +34,7 @@
|
|
33
34
|
* Check whether test/unit has really been loaded before calling a method it defines (Brian Donovan). Closes #503.
|
34
35
|
* Fix spec_path for shared groups (Zach Dennis). Closes #615.
|
35
36
|
* stubbed message expectation not verified if it has been called *before* the expectation (Matthias Hennemeyer). Closes #637.
|
37
|
+
* stubs calculate return value by executing block passed to #and_return (hint from Aisha Fenton). Closes #642.
|
36
38
|
|
37
39
|
=== Version 1.1.11 / 2008-10-24
|
38
40
|
|
data/Manifest.txt
CHANGED
@@ -52,7 +52,8 @@ examples/passing/stack_spec.rb
|
|
52
52
|
examples/passing/stack_spec_with_nested_example_groups.rb
|
53
53
|
examples/passing/stubbing_example.rb
|
54
54
|
examples/passing/yielding_example.rb
|
55
|
-
|
55
|
+
examples/ruby1.9.compatibility/access_to_constants_spec.rb
|
56
|
+
features/before_and_after_blocks/before_and_after_blocks.feature
|
56
57
|
features/example_groups/autogenerated_docstrings.feature
|
57
58
|
features/example_groups/example_group_with_should_methods.feature
|
58
59
|
features/example_groups/nested_groups.feature
|
@@ -139,6 +140,7 @@ lib/spec/mocks/space.rb
|
|
139
140
|
lib/spec/mocks/spec_methods.rb
|
140
141
|
lib/spec/rake/spectask.rb
|
141
142
|
lib/spec/rake/verify_rcov.rb
|
143
|
+
lib/spec/ruby.rb
|
142
144
|
lib/spec/runner.rb
|
143
145
|
lib/spec/runner/backtrace_tweaker.rb
|
144
146
|
lib/spec/runner/class_and_arguments_parser.rb
|
@@ -190,7 +192,6 @@ resources/rake/examples.rake
|
|
190
192
|
resources/rake/examples_with_rcov.rake
|
191
193
|
resources/rake/failing_examples_with_html.rake
|
192
194
|
resources/rake/verify_rcov.rake
|
193
|
-
resources/spec/before_blocks_example.rb
|
194
195
|
resources/spec/example_group_with_should_methods.rb
|
195
196
|
resources/spec/simple_spec.rb
|
196
197
|
resources/spec/spec_with_flexmock.rb
|
@@ -214,7 +215,6 @@ spec/spec/example/example_group_methods_spec.rb
|
|
214
215
|
spec/spec/example/example_group_spec.rb
|
215
216
|
spec/spec/example/example_matcher_spec.rb
|
216
217
|
spec/spec/example/example_methods_spec.rb
|
217
|
-
spec/spec/example/example_runner_spec.rb
|
218
218
|
spec/spec/example/helper_method_spec.rb
|
219
219
|
spec/spec/example/nested_example_group_spec.rb
|
220
220
|
spec/spec/example/pending_module_spec.rb
|
@@ -308,6 +308,8 @@ spec/spec/runner/formatter/html_formatted-1.8.5-jruby.html
|
|
308
308
|
spec/spec/runner/formatter/html_formatted-1.8.5.html
|
309
309
|
spec/spec/runner/formatter/html_formatted-1.8.6-jruby.html
|
310
310
|
spec/spec/runner/formatter/html_formatted-1.8.6.html
|
311
|
+
spec/spec/runner/formatter/html_formatted-1.8.7.html
|
312
|
+
spec/spec/runner/formatter/html_formatted-1.9.1.html
|
311
313
|
spec/spec/runner/formatter/html_formatter_spec.rb
|
312
314
|
spec/spec/runner/formatter/nested_text_formatter_spec.rb
|
313
315
|
spec/spec/runner/formatter/profile_formatter_spec.rb
|
@@ -320,6 +322,8 @@ spec/spec/runner/formatter/story/plain_text_formatter_spec.rb
|
|
320
322
|
spec/spec/runner/formatter/story/progress_bar_formatter_spec.rb
|
321
323
|
spec/spec/runner/formatter/text_mate_formatted-1.8.4.html
|
322
324
|
spec/spec/runner/formatter/text_mate_formatted-1.8.6.html
|
325
|
+
spec/spec/runner/formatter/text_mate_formatted-1.8.7.html
|
326
|
+
spec/spec/runner/formatter/text_mate_formatted-1.9.1.html
|
323
327
|
spec/spec/runner/heckle_runner_spec.rb
|
324
328
|
spec/spec/runner/heckler_spec.rb
|
325
329
|
spec/spec/runner/noisy_backtrace_tweaker_spec.rb
|
data/Rakefile
CHANGED
@@ -44,7 +44,7 @@ Spec::Rake::SpecTask.new do |t|
|
|
44
44
|
unless ENV['NO_RCOV']
|
45
45
|
t.rcov = true
|
46
46
|
t.rcov_dir = 'coverage'
|
47
|
-
t.rcov_opts = ['--text-report', '--exclude', "lib/spec.rb,lib/spec/runner.rb,spec\/spec,bin\/spec,examples,\/
|
47
|
+
t.rcov_opts = ['--text-report', '--exclude', "lib/spec.rb,lib/spec/runner.rb,spec\/spec,bin\/spec,examples,\/gems,\/Library\/Ruby,\.autotest,#{ENV['GEM_HOME']}"]
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# courtesy of Matthias Hennemeyer
|
2
|
+
#
|
3
|
+
# The following should pass against ruby 1.8 and 1.9. It currently only passes
|
4
|
+
# 1.8 (as of 1/2/2009)
|
5
|
+
#
|
6
|
+
# Once cucumber supports ruby 1.9, this should be moved to cucumber scenarios instead.
|
7
|
+
module Foo
|
8
|
+
module Bar
|
9
|
+
|
10
|
+
module ModuleInEnclosingModule;end
|
11
|
+
class ClassInEnclosingModule;end
|
12
|
+
def method_in_enclosing_module;end
|
13
|
+
CONSTANT_IN_ENCLOSING_MODULE = 0
|
14
|
+
|
15
|
+
describe "Examples trying to access constants defined in an enclosing module" do
|
16
|
+
|
17
|
+
it "can access Modules" do
|
18
|
+
ModuleInEnclosingModule
|
19
|
+
end
|
20
|
+
it "can access Classes" do
|
21
|
+
ClassInEnclosingModule.new
|
22
|
+
end
|
23
|
+
it "can access CONSTANTS" do
|
24
|
+
CONSTANT_IN_ENCLOSING_MODULE
|
25
|
+
end
|
26
|
+
it "can NOT access methods" do
|
27
|
+
lambda {method_in_enclosing_module}.should raise_error(/undefined/)
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "from a nested example group" do
|
31
|
+
|
32
|
+
it "can access Modules" do
|
33
|
+
ModuleInEnclosingModule
|
34
|
+
end
|
35
|
+
it "can access Classes" do
|
36
|
+
ClassInEnclosingModule.new
|
37
|
+
end
|
38
|
+
it "can access CONSTANTS" do
|
39
|
+
CONSTANT_IN_ENCLOSING_MODULE
|
40
|
+
end
|
41
|
+
it "can NOT access methods" do
|
42
|
+
lambda {method_in_enclosing_module}.should raise_error(/undefined/)
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "Examples trying to access constants defined in the example group" do
|
50
|
+
|
51
|
+
module ModuleDefinedInGroup;end
|
52
|
+
class ClassDefinedInGroup; end
|
53
|
+
def method_defined_in_group; end
|
54
|
+
CONSTANT_DEFINED_IN_GROUP = 0
|
55
|
+
|
56
|
+
it "can access Modules" do
|
57
|
+
ModuleDefinedInGroup
|
58
|
+
end
|
59
|
+
it "can access Classes" do
|
60
|
+
ClassDefinedInGroup.new
|
61
|
+
end
|
62
|
+
it "can access CONSTANTS" do
|
63
|
+
CONSTANT_DEFINED_IN_GROUP
|
64
|
+
end
|
65
|
+
it "can access methods" do
|
66
|
+
method_defined_in_group
|
67
|
+
end
|
68
|
+
|
69
|
+
describe "that live inside a nested group" do
|
70
|
+
it "can access Modules" do
|
71
|
+
ModuleDefinedInGroup
|
72
|
+
end
|
73
|
+
it "can access Classes" do
|
74
|
+
ClassDefinedInGroup.new
|
75
|
+
end
|
76
|
+
it "can access CONSTANTS" do
|
77
|
+
CONSTANT_DEFINED_IN_GROUP
|
78
|
+
end
|
79
|
+
it "can access methods" do
|
80
|
+
method_defined_in_group
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
@@ -0,0 +1,168 @@
|
|
1
|
+
Feature: before and after blocks
|
2
|
+
|
3
|
+
As a developer using RSpec
|
4
|
+
I want to execute arbitrary code before and after each example
|
5
|
+
So that I can control the environment in which it is run
|
6
|
+
|
7
|
+
This is supported by the before and after methods which each take a symbol
|
8
|
+
indicating the scope, and a block of code to execute.
|
9
|
+
|
10
|
+
before(:each) blocks are run before each example
|
11
|
+
before(:all) blocks are run once before all of the examples in a group
|
12
|
+
before(:suite) blocks are run once before the entire suite
|
13
|
+
|
14
|
+
after(:each) blocks are run after each example
|
15
|
+
after(:all) blocks are run once after all of the examples in a group
|
16
|
+
after(:suite) blocks are run once after the entire suite
|
17
|
+
|
18
|
+
Before and after blocks are called in the following order:
|
19
|
+
before suite
|
20
|
+
before all
|
21
|
+
before each
|
22
|
+
after each
|
23
|
+
after all
|
24
|
+
after suite
|
25
|
+
|
26
|
+
Before and after blocks can be defined in the example groups to which they
|
27
|
+
apply or in a configuration. When defined in a configuration, they can be
|
28
|
+
applied to all groups or subsets of all groups defined by example group
|
29
|
+
types.
|
30
|
+
|
31
|
+
Scenario: define before(:each) block in example group
|
32
|
+
Given the following spec:
|
33
|
+
"""
|
34
|
+
class Thing
|
35
|
+
def widgets
|
36
|
+
@widgets ||= []
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe Thing do
|
41
|
+
before(:each) do
|
42
|
+
@thing = Thing.new
|
43
|
+
end
|
44
|
+
|
45
|
+
context "initialized in before(:each)" do
|
46
|
+
it "has 0 widgets" do
|
47
|
+
@thing.should have(0).widgets
|
48
|
+
end
|
49
|
+
|
50
|
+
it "can get accept new widgets" do
|
51
|
+
@thing.widgets << Object.new
|
52
|
+
end
|
53
|
+
|
54
|
+
it "does not share state across examples" do
|
55
|
+
@thing.should have(0).widgets
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
"""
|
60
|
+
When I run it with the spec script
|
61
|
+
Then the stdout should match "3 examples, 0 failures"
|
62
|
+
|
63
|
+
Scenario: define before(:all) block in example group
|
64
|
+
Given the following spec:
|
65
|
+
"""
|
66
|
+
class Thing
|
67
|
+
def widgets
|
68
|
+
@widgets ||= []
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe Thing do
|
73
|
+
before(:all) do
|
74
|
+
@thing = Thing.new
|
75
|
+
end
|
76
|
+
|
77
|
+
context "initialized in before(:all)" do
|
78
|
+
it "has 0 widgets" do
|
79
|
+
@thing.should have(0).widgets
|
80
|
+
end
|
81
|
+
|
82
|
+
it "can get accept new widgets" do
|
83
|
+
@thing.widgets << Object.new
|
84
|
+
end
|
85
|
+
|
86
|
+
it "shares state across examples" do
|
87
|
+
@thing.should have(1).widgets
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
"""
|
92
|
+
When I run it with the spec script
|
93
|
+
Then the stdout should match "3 examples, 0 failures"
|
94
|
+
|
95
|
+
Scenario: define before and after blocks in configuration
|
96
|
+
Given the following spec:
|
97
|
+
"""
|
98
|
+
Spec::Runner.configure do |config|
|
99
|
+
config.before(:suite) do
|
100
|
+
$before_suite = "before suite"
|
101
|
+
end
|
102
|
+
config.before(:each) do
|
103
|
+
@before_each = "before each"
|
104
|
+
end
|
105
|
+
config.before(:all) do
|
106
|
+
@before_all = "before all"
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe "stuff in before blocks" do
|
111
|
+
describe "with :suite" do
|
112
|
+
it "should be available in the example" do
|
113
|
+
$before_suite.should == "before suite"
|
114
|
+
end
|
115
|
+
end
|
116
|
+
describe "with :all" do
|
117
|
+
it "should be available in the example" do
|
118
|
+
@before_all.should == "before all"
|
119
|
+
end
|
120
|
+
end
|
121
|
+
describe "with :each" do
|
122
|
+
it "should be available in the example" do
|
123
|
+
@before_each.should == "before each"
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
"""
|
128
|
+
When I run it with the spec script
|
129
|
+
Then the stdout should match "3 examples, 0 failures"
|
130
|
+
|
131
|
+
Scenario: before/after blocks are run in order
|
132
|
+
Given the following spec:
|
133
|
+
"""
|
134
|
+
Spec::Runner.configure do |config|
|
135
|
+
config.before(:suite) do
|
136
|
+
puts "before suite"
|
137
|
+
end
|
138
|
+
config.after(:suite) do
|
139
|
+
puts "after suite"
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
describe "before and after callbacks" do
|
144
|
+
before(:all) do
|
145
|
+
puts "before all"
|
146
|
+
end
|
147
|
+
|
148
|
+
before(:each) do
|
149
|
+
puts "before each"
|
150
|
+
end
|
151
|
+
|
152
|
+
after(:each) do
|
153
|
+
puts "after each"
|
154
|
+
end
|
155
|
+
|
156
|
+
after(:all) do
|
157
|
+
puts "after all"
|
158
|
+
end
|
159
|
+
|
160
|
+
it "gets run in order" do
|
161
|
+
|
162
|
+
end
|
163
|
+
end
|
164
|
+
"""
|
165
|
+
|
166
|
+
When I run it with the spec script
|
167
|
+
Then the stdout should match /before suite\nbefore all\nbefore each\nafter each\n\.after all\n.*after suite/m
|
168
|
+
|
@@ -5,6 +5,13 @@ Given /^the file (.*)$/ do |relative_path|
|
|
5
5
|
end
|
6
6
|
end
|
7
7
|
|
8
|
+
Given /^the following spec:$/ do |spec|
|
9
|
+
@path = "/tmp/example_spec.rb"
|
10
|
+
File.open(@path, "w") do |f|
|
11
|
+
f.write spec
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
8
15
|
When /^I run it with the (.*)$/ do |interpreter|
|
9
16
|
stderr_file = Tempfile.new('rspec')
|
10
17
|
stderr_file.close
|
@@ -40,7 +47,6 @@ Then /^the (.*) should not match (.*)$/ do |stream, string_or_regex|
|
|
40
47
|
written.should_not smart_match(string_or_regex)
|
41
48
|
end
|
42
49
|
|
43
|
-
|
44
50
|
Then /^the exit code should be (\d+)$/ do |exit_code|
|
45
51
|
if @exit_code != exit_code.to_i
|
46
52
|
raise "Did not exit with #{exit_code}, but with #{@exit_code}. Standard error:\n#{@stderr}"
|
data/lib/spec.rb
CHANGED
data/lib/spec/dsl/main.rb
CHANGED
@@ -21,10 +21,11 @@ module Spec
|
|
21
21
|
#
|
22
22
|
def describe(*args, &block)
|
23
23
|
Spec::Example::add_spec_path_to(args)
|
24
|
+
Spec::Example::ExampleGroupFactory.assign_scope(self, args)
|
24
25
|
Spec::Example::ExampleGroupFactory.create_example_group(*args, &block)
|
25
26
|
end
|
26
27
|
alias :context :describe
|
27
|
-
|
28
|
+
|
28
29
|
# Creates an example group that can be shared by other example groups
|
29
30
|
#
|
30
31
|
# == Examples
|
@@ -1,6 +1,16 @@
|
|
1
1
|
module Spec
|
2
2
|
module Example
|
3
3
|
module BeforeAndAfterHooks
|
4
|
+
class << self
|
5
|
+
def before_suite_parts
|
6
|
+
@before_suite_parts ||= []
|
7
|
+
end
|
8
|
+
|
9
|
+
def after_suite_parts
|
10
|
+
@after_suite_parts ||= []
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
4
14
|
# Registers a block to be executed before each example.
|
5
15
|
# This method prepends +block+ to existing before blocks.
|
6
16
|
def prepend_before(*args, &block)
|
@@ -58,13 +68,21 @@ module Spec
|
|
58
68
|
@after_each_parts ||= []
|
59
69
|
end
|
60
70
|
|
71
|
+
def before_suite_parts
|
72
|
+
BeforeAndAfterHooks.before_suite_parts
|
73
|
+
end
|
74
|
+
|
75
|
+
def after_suite_parts
|
76
|
+
BeforeAndAfterHooks.after_suite_parts
|
77
|
+
end
|
78
|
+
|
61
79
|
private
|
62
80
|
|
63
81
|
def before_parts(*args)
|
64
82
|
case Spec::Example.scope_from(*args)
|
65
83
|
when :each; before_each_parts
|
66
84
|
when :all; before_all_parts
|
67
|
-
when :suite;
|
85
|
+
when :suite; before_suite_parts
|
68
86
|
end
|
69
87
|
end
|
70
88
|
|
@@ -72,7 +90,7 @@ module Spec
|
|
72
90
|
case Spec::Example.scope_from(*args)
|
73
91
|
when :each; after_each_parts
|
74
92
|
when :all; after_all_parts
|
75
|
-
when :suite;
|
93
|
+
when :suite; after_suite_parts
|
76
94
|
end
|
77
95
|
end
|
78
96
|
|
@@ -62,6 +62,17 @@ module Spec
|
|
62
62
|
SharedExampleGroup.register(*args, &block)
|
63
63
|
end
|
64
64
|
|
65
|
+
def include_constants_in(context, &block)
|
66
|
+
if (Spec::Ruby.version.to_f >= 1.9 && Module === context && !(Class === context))
|
67
|
+
return lambda {include context;instance_eval(&block)}
|
68
|
+
end
|
69
|
+
block
|
70
|
+
end
|
71
|
+
|
72
|
+
def assign_scope(scope, args)
|
73
|
+
args.last[:scope] = scope
|
74
|
+
end
|
75
|
+
|
65
76
|
protected
|
66
77
|
|
67
78
|
def determine_superclass(opts)
|