rspec-core 2.0.0.beta.5 → 2.0.0.beta.6

Sign up to get free protection for your applications and to get access to all the features.
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ -Ispec
@@ -63,6 +63,18 @@ Use the documentation formatter to see the resulting spec:
63
63
  Finished in 0.000379 seconds
64
64
  1 example, 0 failures
65
65
 
66
+ ## Configuration
67
+
68
+ You can define runtime configuration options in four places. They
69
+ are loaded and processed in this order:
70
+
71
+ * ~/.rspec
72
+ * .rspec
73
+ * RSpec.configure
74
+ * command line
75
+
76
+ Run `rspec --help` to see supported configuration options.
77
+
66
78
  #### Also see
67
79
 
68
80
  * [http://github.com/rspec/rspec](http://github.com/rspec/rspec)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.0.0.beta.5
1
+ 2.0.0.beta.6
@@ -2,9 +2,9 @@ Feature: example name option
2
2
 
3
3
  Use the --example (or -e) option to filter the examples to be run by name.
4
4
 
5
- The submitted argument is compiled to a Ruby Regexp, and matched against the
6
- full description of the example, which is the concatenation of descriptions
7
- of the group (including any nested groups) and the example.
5
+ The argument is compiled to a Ruby Regexp, and matched against the full
6
+ description of the example, which is the concatenation of descriptions of the
7
+ group (including any nested groups) and the example.
8
8
 
9
9
  This allows you to run a single uniquely named example, all examples with
10
10
  similar names, all the example in a uniquely named group, etc, etc.
@@ -7,33 +7,53 @@ Feature: line number appended to file path
7
7
  Background:
8
8
  Given a file named "example_spec.rb" with:
9
9
  """
10
- describe "a group" do
10
+ describe "outer group" do
11
11
 
12
- it "has a first example" do
12
+ it "first example in outer group" do
13
13
 
14
14
  end
15
15
 
16
- it "has a second example" do
16
+ it "second example in outer group" do
17
17
 
18
18
  end
19
+
20
+ describe "nested group" do
21
+
22
+ it "example in nested group" do
23
+
24
+ end
19
25
 
26
+ end
27
+
20
28
  end
21
29
  """
22
30
 
23
- Scenario: two examples - both examples from the group declaration
31
+ @wip
32
+ Scenario: nested groups - outer group on declaration line
24
33
  When I run "rspec example_spec.rb:1 --format doc"
25
- Then I should see "2 examples, 0 failures"
26
- And I should see "has a second example"
27
- And I should see "has a first example"
34
+ Then I should see "3 examples, 0 failures"
35
+ And I should see "second example in outer group"
36
+ And I should see "first example in outer group"
37
+ And I should see "example in nested group"
38
+
39
+ @wip
40
+ Scenario: nested groups - inner group on declaration line
41
+ When I run "rspec example_spec.rb:11 --format doc"
42
+ Then I should see "3 examples, 0 failures"
43
+ And I should see "example in nested group"
44
+ And I should not see "second example in outer group"
45
+ And I should not see "first example in outer group"
28
46
 
29
47
  Scenario: two examples - first example on declaration line
30
48
  When I run "rspec example_spec.rb:3 --format doc"
31
49
  Then I should see "1 example, 0 failures"
32
- And I should see "has a first example"
33
- But the stdout should not contain "has a second example"
50
+ And I should see "first example in outer group"
51
+ But I should not see "second example in outer group"
52
+ And I should not see "example in nested group"
34
53
 
35
54
  Scenario: two examples - second example on declaration line
36
55
  When I run "rspec example_spec.rb:7 --format doc"
37
56
  Then I should see "1 example, 0 failures"
38
- And I should see "has a second example"
39
- But the stdout should not contain "has a first example"
57
+ And I should see "second example in outer group"
58
+ But I should not see "first example in outer group"
59
+ And I should not see "example in nested group"
@@ -7,18 +7,11 @@ Feature: spec/spec.opts
7
7
  Options declared in spec/spec.opts will override configuration
8
8
  set up in Rspec.configure blocks.
9
9
 
10
- Background:
11
- Given a directory named "spec"
12
-
13
10
  Scenario: color set in Rspec.configure
14
- Given a file named "spec/spec_helper.rb" with:
11
+ Given a file named "spec/example_spec.rb" with:
15
12
  """
16
- require "rspec/expectations"
17
13
  Rspec.configure {|c| c.color_enabled = true }
18
- """
19
- And a file named "spec/example_spec.rb" with:
20
- """
21
- require "spec_helper"
14
+
22
15
  describe "color_enabled" do
23
16
  context "when set with Rspec.configure" do
24
17
  it "is true" do
@@ -30,15 +23,13 @@ Feature: spec/spec.opts
30
23
  When I run "rspec spec/example_spec.rb"
31
24
  Then I should see "1 example, 0 failures"
32
25
 
33
- Scenario: color set in spec/spec.opts
34
- Given a file named "spec/spec.opts" with:
26
+ Scenario: color set in .rspec
27
+ Given a file named ".rspec" with:
35
28
  """
36
29
  --color
37
30
  """
38
31
  And a file named "spec/example_spec.rb" with:
39
32
  """
40
- require "rspec/expectations"
41
-
42
33
  describe "color_enabled" do
43
34
  context "when set with Rspec.configure" do
44
35
  it "is true" do
@@ -49,16 +40,15 @@ Feature: spec/spec.opts
49
40
  """
50
41
  When I run "rspec spec/example_spec.rb"
51
42
  Then I should see "1 example, 0 failures"
52
-
53
- @wip
54
- Scenario: formatter set in both (spec.opts wins)
55
- Given a file named "spec/spec.opts" with:
43
+
44
+ @wip
45
+ Scenario: formatter set in both (.rspec wins)
46
+ Given a file named ".rspec" with:
56
47
  """
57
- --formatter documentation
48
+ --format documentation
58
49
  """
59
50
  And a file named "spec/spec_helper.rb" with:
60
51
  """
61
- require "rspec/expectations"
62
52
  Rspec.configure {|c| c.formatter = 'progress'}
63
53
  """
64
54
  And a file named "spec/example_spec.rb" with:
@@ -1,4 +1,4 @@
1
- $LOAD_PATH << File.expand_path("../../../../rspec-expectations/lib", __FILE__)
1
+ $LOAD_PATH.unshift File.expand_path("../../../../rspec-expectations/lib", __FILE__)
2
2
  require 'rspec/expectations'
3
3
  require 'aruba'
4
4
 
@@ -1,15 +1,19 @@
1
1
  require 'rspec/core/load_path'
2
2
  require 'rspec/core/deprecation'
3
- require 'rspec/core/mocking/with_absolutely_nothing'
3
+
4
+ require 'rspec/core/hooks'
5
+ require 'rspec/core/subject'
6
+ require 'rspec/core/let'
7
+ require 'rspec/core/metadata'
8
+
4
9
  require 'rspec/core/around_proxy'
5
10
  require 'rspec/core/world'
6
11
  require 'rspec/core/configuration'
7
- require 'rspec/core/command_line_options'
12
+ require 'rspec/core/configuration_options'
8
13
  require 'rspec/core/runner'
9
14
  require 'rspec/core/example'
10
15
  require 'rspec/core/kernel_extensions'
11
16
  require 'rspec/core/shared_example_group'
12
- require 'rspec/core/example_group_subject'
13
17
  require 'rspec/core/example_group'
14
18
  require 'rspec/core/formatters'
15
19
  require 'rspec/core/backward_compatibility'
@@ -29,7 +33,7 @@ module Rspec
29
33
 
30
34
  def self.configure
31
35
  Rspec.deprecate('Rspec::Core.configure', 'Rspec.configure', '2.0.0')
32
- yield configuration if block_given?
36
+ yield Rspec.configuration if block_given?
33
37
  end
34
38
 
35
39
  def self.world
@@ -92,6 +92,10 @@ module Rspec
92
92
  @options[:backtrace_clean_patterns].clear
93
93
  end
94
94
 
95
+ def libs=(libs)
96
+ libs.map {|lib| $LOAD_PATH.unshift lib}
97
+ end
98
+
95
99
  def debug=(bool)
96
100
  return unless bool
97
101
  begin
@@ -184,19 +188,14 @@ EOM
184
188
  @run_all_when_everything_filtered
185
189
  end
186
190
 
187
- # Where does output go? For now $stdout
188
191
  def output
189
192
  $stdout
190
193
  end
191
194
 
192
- def puts(msg='')
195
+ def puts(msg="")
193
196
  output.puts(msg)
194
197
  end
195
198
 
196
- def parse_command_line_args(args)
197
- @command_line_options = Rspec::Core::CommandLineOptions.parse(args)
198
- end
199
-
200
199
  def include(mod, options={})
201
200
  @include_or_extend_modules << [:include, mod, options]
202
201
  end
@@ -230,6 +229,10 @@ EOM
230
229
  Rspec::Core::ExampleGroup.send(:include, Rspec::Core::MockFrameworkAdapter)
231
230
  end
232
231
 
232
+ def require_files_to_run
233
+ files_to_run.map {|f| require f }
234
+ end
235
+
233
236
  end
234
237
  end
235
238
  end
@@ -0,0 +1,137 @@
1
+ require 'optparse'
2
+ # http://www.ruby-doc.org/stdlib/libdoc/optparse/rdoc/classes/OptionParser.html
3
+
4
+ module Rspec
5
+ module Core
6
+
7
+ class ConfigurationOptions
8
+ LOCAL_OPTIONS_FILE = ".rspec"
9
+ GLOBAL_OPTIONS_FILE = File.join(File.expand_path("~"), ".rspec")
10
+
11
+ attr_reader :args, :options
12
+
13
+ def initialize(args)
14
+ @args = args
15
+ @options = {}
16
+ end
17
+
18
+ def apply_to(config)
19
+ merged_options.each do |key, value|
20
+ config.send("#{key}=", value)
21
+ end
22
+ end
23
+
24
+ def parse_command_line_options
25
+ @options = Parser.parse!(@args)
26
+ @options[:files_or_directories_to_run] = @args
27
+ @options
28
+ end
29
+
30
+ private
31
+
32
+ def merged_options
33
+ [global_options, local_options, command_line_options].inject({}) do |merged, options|
34
+ merged.merge(options)
35
+ end
36
+ end
37
+
38
+ def command_line_options
39
+ parse_command_line_options
40
+ end
41
+
42
+ class Parser
43
+ def self.parse!(args)
44
+ new.parse!(args)
45
+ end
46
+
47
+ class << self
48
+ alias_method :parse, :parse!
49
+ end
50
+
51
+ def parse!(args)
52
+ options = {}
53
+ parser(options).parse!(args)
54
+ options
55
+ end
56
+
57
+ alias_method :parse, :parse!
58
+
59
+ def parser(options)
60
+ OptionParser.new do |parser|
61
+ parser.banner = "Usage: rspec [options] [files or directories]"
62
+
63
+ parser.on('-b', '--backtrace', 'Enable full backtrace') do |o|
64
+ options[:full_backtrace] = true
65
+ end
66
+
67
+ parser.on('-c', '--[no-]color', '--[no-]colour', 'Enable color in the output') do |o|
68
+ options[:color_enabled] = o
69
+ end
70
+
71
+ parser.on('-d', '--debug', 'Enable debugging') do |o|
72
+ options[:debug] = true
73
+ end
74
+
75
+ parser.on('-e', '--example PATTERN', "Run examples whose full descriptions match this pattern",
76
+ "(PATTERN is compiled into a Ruby regular expression)") do |o|
77
+ options[:full_description] = /#{o}/
78
+ end
79
+
80
+ parser.on('-f', '--formatter FORMATTER', 'Choose a formatter',
81
+ ' [p]rogress (default - dots)',
82
+ ' [d]ocumentation (group and example names)') do |o|
83
+ options[:formatter] = o
84
+ end
85
+
86
+ parser.on_tail('-h', '--help', "You're looking at it.") do
87
+ puts parser
88
+ exit
89
+ end
90
+
91
+ parser.on('-I DIRECTORY', 'specify $LOAD_PATH directory (may be used more than once)') do |dir|
92
+ options[:libs] ||= []
93
+ options[:libs] << dir
94
+ end
95
+
96
+ parser.on('-l', '--line_number LINE', 'Specify the line number of a single example to run') do |o|
97
+ options[:line_number] = o
98
+ end
99
+
100
+ parser.on('-o', '--options PATH', 'Read configuration options from a file path. (Defaults to spec/spec.parser)') do |o|
101
+ options[:options_file] = o || local_options_file
102
+ end
103
+
104
+ parser.on('-p', '--profile', 'Enable profiling of examples with output of the top 10 slowest examples') do |o|
105
+ options[:profile_examples] = o
106
+ end
107
+ end
108
+ end
109
+ end
110
+
111
+ def global_options
112
+ parse_options_file(GLOBAL_OPTIONS_FILE)
113
+ end
114
+
115
+ def local_options
116
+ parse_options_file(local_options_file)
117
+ end
118
+
119
+ def parse_options_file(path)
120
+ Parser.parse(args_from_options_file(path))
121
+ end
122
+
123
+ def args_from_options_file(path)
124
+ return [] unless File.exist?(path)
125
+ File.readlines(path).map {|l| l.split}.flatten
126
+ end
127
+
128
+ def local_options_file
129
+ return @options.delete(:options_file) if @options[:options_file]
130
+ return LOCAL_OPTIONS_FILE if File.exist?(LOCAL_OPTIONS_FILE)
131
+ Rspec.deprecate("spec/spec.opts", ".rspec or ~/.rspec", "2.0.0") if File.exist?("spec/spec.opts")
132
+ "spec/spec.opts"
133
+ end
134
+
135
+ end
136
+ end
137
+ end
@@ -1,13 +1,8 @@
1
- require 'rspec/core/hooks'
2
- require 'rspec/core/example_group_subject'
3
- require 'rspec/core/let'
4
- require 'rspec/core/metadata'
5
-
6
1
  module Rspec
7
2
  module Core
8
3
  class ExampleGroup
9
4
  extend Hooks
10
- include ExampleGroupSubject
5
+ include Subject
11
6
  include Let
12
7
 
13
8
  attr_accessor :running_example
@@ -31,10 +26,10 @@ module Rspec
31
26
  def self.alias_example_to(new_alias, extra_options={})
32
27
  new_alias = <<-END_RUBY
33
28
  def self.#{new_alias}(desc=nil, options={}, &block)
34
- updated_options = options.update(:caller => caller)
35
- updated_options.update(:pending => true) unless block
36
- updated_options.update(#{extra_options.inspect})
37
- examples << Rspec::Core::Example.new(self, desc, updated_options, block)
29
+ options.update(:pending => true) unless block
30
+ options.update(:caller => caller)
31
+ options.update(#{extra_options.inspect})
32
+ examples << Rspec::Core::Example.new(self, desc, options, block)
38
33
  end
39
34
  END_RUBY
40
35
  module_eval(new_alias, __FILE__, __LINE__)
@@ -1,7 +1,5 @@
1
1
  module Rspec
2
-
3
2
  module Core
4
-
5
3
  module Formatters
6
4
 
7
5
  class BaseFormatter
@@ -15,20 +13,8 @@ module Rspec
15
13
  @example_group = nil
16
14
  end
17
15
 
18
- def configuration
19
- Rspec.configuration
20
- end
21
-
22
16
  def output
23
- Rspec.configuration.output
24
- end
25
-
26
- def profile_examples?
27
- Rspec.configuration.profile_examples
28
- end
29
-
30
- def color_enabled?
31
- configuration.color_enabled?
17
+ configuration.output
32
18
  end
33
19
 
34
20
  def pending_examples
@@ -39,6 +25,21 @@ module Rspec
39
25
  @failed_examples ||= ::Rspec::Core.world.find(examples, :positive, :execution_result => { :status => 'failed' })
40
26
  end
41
27
 
28
+ def report(count)
29
+ sync_output do
30
+ start(count)
31
+ # TODO - spec that we still dump even when there's
32
+ # an exception
33
+ begin
34
+ yield self
35
+ ensure
36
+ stop
37
+ dump(@duration)
38
+ close
39
+ end
40
+ end
41
+ end
42
+
42
43
  # This method is invoked before any examples are run, right after
43
44
  # they have all been collected. This can be useful for special
44
45
  # formatters that need to provide progress on feedback (graphical ones)
@@ -46,9 +47,14 @@ module Rspec
46
47
  # This method will only be invoked once, and the next one to be invoked
47
48
  # is #add_example_group
48
49
  def start(example_count)
50
+ @start = Time.now
49
51
  @example_count = example_count
50
52
  end
51
53
 
54
+ def stop
55
+ @duration = Time.now - @start
56
+ end
57
+
52
58
  def example_finished(example)
53
59
  examples << example
54
60
  end
@@ -60,8 +66,13 @@ module Rspec
60
66
  def add_example_group(example_group)
61
67
  @example_group = example_group
62
68
  end
63
-
64
- alias_method :add_example_group, :add_example_group
69
+
70
+ def dump(duration)
71
+ start_dump(duration)
72
+ dump_failures
73
+ dump_summary
74
+ dump_pending
75
+ end
65
76
 
66
77
  # This method is invoked after all of the examples have executed. The next method
67
78
  # to be invoked after this one is #dump_failure (once for each failed example),
@@ -95,7 +106,11 @@ module Rspec
95
106
  cleansed.empty? ? backtrace : cleansed
96
107
  end
97
108
 
98
- protected
109
+ protected
110
+
111
+ def configuration
112
+ Rspec.configuration
113
+ end
99
114
 
100
115
  def backtrace_line(line)
101
116
  return nil if configuration.cleaned_from_backtrace?(line)
@@ -119,9 +134,29 @@ module Rspec
119
134
  end
120
135
  end
121
136
 
137
+ def sync_output
138
+ begin
139
+ old_sync, output.sync = output.sync, true if output_supports_sync
140
+ yield
141
+ ensure
142
+ output.sync = old_sync if output_supports_sync
143
+ end
144
+ end
145
+
146
+ def output_supports_sync
147
+ output.respond_to?(:sync=)
148
+ end
149
+
150
+ def profile_examples?
151
+ configuration.profile_examples
152
+ end
153
+
154
+ def color_enabled?
155
+ configuration.color_enabled?
156
+ end
157
+
122
158
  end
123
159
 
124
160
  end
125
161
  end
126
-
127
162
  end
@@ -77,6 +77,12 @@ EOM
77
77
  update(options)
78
78
  end
79
79
 
80
+ def all_apply?(filters)
81
+ filters.all? do |filter_on, filter|
82
+ apply_condition(filter_on, filter)
83
+ end
84
+ end
85
+
80
86
  def apply_condition(filter_on, filter, metadata=nil)
81
87
  metadata ||= self
82
88
  case filter
@@ -97,12 +103,6 @@ EOM
97
103
  end
98
104
  end
99
105
 
100
- def all_apply?(filters)
101
- filters.all? do |filter_on, filter|
102
- apply_condition(filter_on, filter)
103
- end
104
- end
105
-
106
106
  private
107
107
 
108
108
  def superclass_metadata
@@ -1,6 +1,5 @@
1
1
  module Rspec
2
2
  module Core
3
-
4
3
  class Runner
5
4
 
6
5
  def self.installed_at_exit?
@@ -21,47 +20,42 @@ module Rspec
21
20
  configuration.formatter
22
21
  end
23
22
 
24
- def require_all_files(configuration)
25
- configuration.files_to_run.map {|f| require f }
23
+ def run(args = [])
24
+ configure(args)
25
+
26
+ reporter.report(example_count) do |reporter|
27
+ example_groups.run_all(reporter)
28
+ end
29
+
30
+ example_groups.success?
26
31
  end
27
32
 
28
- def run(args = [])
29
- Rspec::Core::CommandLineOptions.parse(args).apply(configuration)
30
-
31
- require_all_files(configuration)
33
+ private
32
34
 
35
+ def configure(args)
36
+ Rspec::Core::ConfigurationOptions.new(args).apply_to(configuration)
37
+ configuration.require_files_to_run
33
38
  configuration.configure_mock_framework
34
-
35
- total_examples_to_run = Rspec::Core.world.total_examples_to_run
36
-
37
- old_sync, reporter.output.sync = reporter.output.sync, true if reporter.output.respond_to?(:sync=)
38
-
39
- suite_success = true
39
+ end
40
40
 
41
- reporter_supports_sync = reporter.output.respond_to?(:sync=)
42
- old_sync, reporter.output.sync = reporter.output.sync, true if reporter_supports_sync
41
+ def example_count
42
+ Rspec::Core.world.total_examples_to_run
43
+ end
43
44
 
44
- reporter.start(total_examples_to_run) # start the clock
45
- start = Time.now
45
+ def example_groups
46
+ Rspec::Core.world.example_groups_to_run.extend(ExampleGroups)
47
+ end
46
48
 
47
- Rspec::Core.world.example_groups_to_run.each do |example_group|
48
- suite_success &= example_group.run(reporter)
49
+ module ExampleGroups
50
+ def run_all(reporter)
51
+ @success = self.inject(true) {|success, group| success &= group.run(reporter)}
49
52
  end
50
53
 
51
- reporter.start_dump(Time.now - start)
52
-
53
- reporter.dump_failures
54
- reporter.dump_summary
55
- reporter.dump_pending
56
- reporter.close
57
-
58
- reporter.output.sync = old_sync if reporter_supports_sync
59
-
60
- suite_success
54
+ def success?
55
+ @success ||= false
56
+ end
61
57
  end
62
58
 
63
-
64
59
  end
65
-
66
60
  end
67
61
  end
@@ -26,7 +26,7 @@ module Rspec
26
26
 
27
27
  alias :shared_examples_for :share_examples_for
28
28
 
29
- private
29
+ private
30
30
 
31
31
  def ensure_shared_example_group_name_not_taken(name)
32
32
  if Rspec::Core.world.shared_example_groups.has_key?(name)
@@ -1,6 +1,6 @@
1
1
  module Rspec
2
2
  module Core
3
- module ExampleGroupSubject
3
+ module Subject
4
4
 
5
5
  def self.included(kls)
6
6
  kls.extend ClassMethods
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{rspec-core}
8
- s.version = "2.0.0.beta.5"
8
+ s.version = "2.0.0.beta.6"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Chad Humphries", "David Chelimsky"]
12
- s.date = %q{2010-04-04}
12
+ s.date = %q{2010-04-12}
13
13
  s.description = %q{Rspec runner and example group classes}
14
14
  s.email = %q{dchelimsky@gmail.com;chad.humphries@gmail.com}
15
15
  s.executables = ["rspec", "spec"]
@@ -19,6 +19,7 @@ Gem::Specification.new do |s|
19
19
  s.files = [
20
20
  ".document",
21
21
  ".gitignore",
22
+ ".rspec",
22
23
  ".treasure_map.rb",
23
24
  "License.txt",
24
25
  "README.markdown",
@@ -80,7 +81,7 @@ Gem::Specification.new do |s|
80
81
  "features/command_line/example_name_option.feature",
81
82
  "features/command_line/line_number_appended_to_path.feature",
82
83
  "features/command_line/line_number_option.feature",
83
- "features/configuration/spec_opts.feature",
84
+ "features/configuration/options_file.feature",
84
85
  "features/example_groups/describe_aliases.feature",
85
86
  "features/example_groups/nested_groups.feature",
86
87
  "features/formatters/custom_formatter.feature",
@@ -101,12 +102,11 @@ Gem::Specification.new do |s|
101
102
  "lib/rspec/core.rb",
102
103
  "lib/rspec/core/around_proxy.rb",
103
104
  "lib/rspec/core/backward_compatibility.rb",
104
- "lib/rspec/core/command_line_options.rb",
105
105
  "lib/rspec/core/configuration.rb",
106
+ "lib/rspec/core/configuration_options.rb",
106
107
  "lib/rspec/core/deprecation.rb",
107
108
  "lib/rspec/core/example.rb",
108
109
  "lib/rspec/core/example_group.rb",
109
- "lib/rspec/core/example_group_subject.rb",
110
110
  "lib/rspec/core/formatters.rb",
111
111
  "lib/rspec/core/formatters/base_formatter.rb",
112
112
  "lib/rspec/core/formatters/base_text_formatter.rb",
@@ -127,17 +127,16 @@ Gem::Specification.new do |s|
127
127
  "lib/rspec/core/ruby_project.rb",
128
128
  "lib/rspec/core/runner.rb",
129
129
  "lib/rspec/core/shared_example_group.rb",
130
- "lib/rspec/core/shared_example_group_kernel_extensions.rb",
130
+ "lib/rspec/core/subject.rb",
131
131
  "lib/rspec/core/version.rb",
132
132
  "lib/rspec/core/world.rb",
133
133
  "rspec-core.gemspec",
134
134
  "script/console",
135
135
  "spec/autotest/failed_results_re_spec.rb",
136
136
  "spec/autotest/rspec_spec.rb",
137
- "spec/rspec/core/command_line_options_spec.rb",
137
+ "spec/rspec/core/configuration_options_spec.rb",
138
138
  "spec/rspec/core/configuration_spec.rb",
139
139
  "spec/rspec/core/example_group_spec.rb",
140
- "spec/rspec/core/example_group_subject_spec.rb",
141
140
  "spec/rspec/core/example_spec.rb",
142
141
  "spec/rspec/core/formatters/base_formatter_spec.rb",
143
142
  "spec/rspec/core/formatters/base_text_formatter_spec.rb",
@@ -156,6 +155,7 @@ Gem::Specification.new do |s|
156
155
  "spec/rspec/core/ruby_project_spec.rb",
157
156
  "spec/rspec/core/runner_spec.rb",
158
157
  "spec/rspec/core/shared_example_group_spec.rb",
158
+ "spec/rspec/core/subject_spec.rb",
159
159
  "spec/rspec/core/world_spec.rb",
160
160
  "spec/rspec/core_spec.rb",
161
161
  "spec/ruby_forker.rb",
@@ -166,7 +166,7 @@ Gem::Specification.new do |s|
166
166
  s.homepage = %q{http://github.com/rspec/core}
167
167
  s.post_install_message = %q{**************************************************
168
168
 
169
- Thank you for installing rspec-core-2.0.0.beta.5
169
+ Thank you for installing rspec-core-2.0.0.beta.6
170
170
 
171
171
  This is beta software. If you are looking
172
172
  for a supported production release, please
@@ -178,14 +178,13 @@ Gem::Specification.new do |s|
178
178
  s.require_paths = ["lib"]
179
179
  s.rubyforge_project = %q{rspec}
180
180
  s.rubygems_version = %q{1.3.6}
181
- s.summary = %q{rspec-core-2.0.0.beta.5}
181
+ s.summary = %q{rspec-core-2.0.0.beta.6}
182
182
  s.test_files = [
183
183
  "spec/autotest/failed_results_re_spec.rb",
184
184
  "spec/autotest/rspec_spec.rb",
185
- "spec/rspec/core/command_line_options_spec.rb",
185
+ "spec/rspec/core/configuration_options_spec.rb",
186
186
  "spec/rspec/core/configuration_spec.rb",
187
187
  "spec/rspec/core/example_group_spec.rb",
188
- "spec/rspec/core/example_group_subject_spec.rb",
189
188
  "spec/rspec/core/example_spec.rb",
190
189
  "spec/rspec/core/formatters/base_formatter_spec.rb",
191
190
  "spec/rspec/core/formatters/base_text_formatter_spec.rb",
@@ -204,6 +203,7 @@ Gem::Specification.new do |s|
204
203
  "spec/rspec/core/ruby_project_spec.rb",
205
204
  "spec/rspec/core/runner_spec.rb",
206
205
  "spec/rspec/core/shared_example_group_spec.rb",
206
+ "spec/rspec/core/subject_spec.rb",
207
207
  "spec/rspec/core/world_spec.rb",
208
208
  "spec/rspec/core_spec.rb",
209
209
  "spec/ruby_forker.rb",
@@ -216,19 +216,19 @@ Gem::Specification.new do |s|
216
216
  s.specification_version = 3
217
217
 
218
218
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
219
- s.add_development_dependency(%q<rspec-expectations>, [">= 2.0.0.beta.5"])
220
- s.add_development_dependency(%q<rspec-mocks>, [">= 2.0.0.beta.5"])
219
+ s.add_development_dependency(%q<rspec-expectations>, [">= 2.0.0.beta.6"])
220
+ s.add_development_dependency(%q<rspec-mocks>, [">= 2.0.0.beta.6"])
221
221
  s.add_development_dependency(%q<cucumber>, [">= 0.5.3"])
222
222
  s.add_development_dependency(%q<autotest>, [">= 4.2.9"])
223
223
  else
224
- s.add_dependency(%q<rspec-expectations>, [">= 2.0.0.beta.5"])
225
- s.add_dependency(%q<rspec-mocks>, [">= 2.0.0.beta.5"])
224
+ s.add_dependency(%q<rspec-expectations>, [">= 2.0.0.beta.6"])
225
+ s.add_dependency(%q<rspec-mocks>, [">= 2.0.0.beta.6"])
226
226
  s.add_dependency(%q<cucumber>, [">= 0.5.3"])
227
227
  s.add_dependency(%q<autotest>, [">= 4.2.9"])
228
228
  end
229
229
  else
230
- s.add_dependency(%q<rspec-expectations>, [">= 2.0.0.beta.5"])
231
- s.add_dependency(%q<rspec-mocks>, [">= 2.0.0.beta.5"])
230
+ s.add_dependency(%q<rspec-expectations>, [">= 2.0.0.beta.6"])
231
+ s.add_dependency(%q<rspec-mocks>, [">= 2.0.0.beta.6"])
232
232
  s.add_dependency(%q<cucumber>, [">= 0.5.3"])
233
233
  s.add_dependency(%q<autotest>, [">= 4.2.9"])
234
234
  end
@@ -1,29 +1,34 @@
1
1
  require 'spec_helper'
2
2
  require 'ostruct'
3
3
 
4
- describe Rspec::Core::CommandLineOptions do
4
+ describe Rspec::Core::ConfigurationOptions do
5
5
 
6
6
  def options_from_args(*args)
7
- Rspec::Core::CommandLineOptions.new(args).parse.options
7
+ Rspec::Core::ConfigurationOptions.new(args).parse_command_line_options
8
8
  end
9
9
 
10
10
  describe 'color_enabled' do
11
- example "-c, --colour, or --color should be parsed as true" do
11
+ example "-c, --colour, or --color are parsed as true" do
12
12
  options_from_args('-c').should include(:color_enabled => true)
13
13
  options_from_args('--color').should include(:color_enabled => true)
14
14
  options_from_args('--colour').should include(:color_enabled => true)
15
15
  end
16
16
 
17
- example "--no-color should be parsed as false" do
17
+ example "--no-color is parsed as false" do
18
18
  options_from_args('--no-color').should include(:color_enabled => false)
19
19
  end
20
20
  end
21
21
 
22
- describe 'formatter' do
23
- example '-f or --formatter with no arguments should be parsed as nil' do
24
- options_from_args('--formatter').should include(:formatter => nil)
22
+ describe 'load path additions' do
23
+ example "-I parses like it does w/ ruby command" do
24
+ options_from_args('-I', 'a_dir').should include(:libs => ['a_dir'])
25
+ end
26
+ example "-I can be used more than once" do
27
+ options_from_args('-I', 'dir_1', '-I', 'dir_2').should include(:libs => ['dir_1','dir_2'])
25
28
  end
29
+ end
26
30
 
31
+ describe 'formatter' do
27
32
  example '-f or --formatter with an argument should parse' do
28
33
  options_from_args('--formatter', 'd').should include(:formatter => 'd')
29
34
  options_from_args('-f', 'd').should include(:formatter => 'd')
@@ -52,50 +57,10 @@ describe Rspec::Core::CommandLineOptions do
52
57
  end
53
58
  end
54
59
 
55
- describe "options" do
60
+ describe "options file" do
56
61
  it "is parsed from --options or -o" do
57
- options_from_args('--options', 'spec/spec.opts').should include(:options_file => "spec/spec.opts")
58
- options_from_args('-o', 'foo/spec.opts').should include(:options_file => "foo/spec.opts")
59
- end
60
-
61
- it "defaults to spec/spec.opts when you don't give it a file path" do
62
- options_from_args('-o').should include(:options_file => "spec/spec.opts")
63
- options_from_args('--options').should include(:options_file => "spec/spec.opts")
64
- end
65
-
66
- it "loads automatically" do
67
- cli_options = Rspec::Core::CommandLineOptions.new([]).parse
68
- File.stub(:exist?) { true }
69
- File.stub(:readlines) { ["--formatter", "doc"] }
70
- config = OpenStruct.new
71
- cli_options.apply(config)
72
- config.formatter.should == 'doc'
73
- end
74
-
75
- it "allows options on one line" do
76
- cli_options = Rspec::Core::CommandLineOptions.new([]).parse
77
- File.stub(:exist?) { true }
78
- File.stub(:readlines) { ["--formatter doc"] }
79
- config = OpenStruct.new
80
- cli_options.apply(config)
81
- config.formatter.should == 'doc'
82
- end
83
-
84
- it "merges options from the CLI and file options gracefully" do
85
- cli_options = Rspec::Core::CommandLineOptions.new(['--formatter', 'progress', '--options', 'spec/spec.opts']).parse
86
- cli_options.stub!(:parse_spec_file_contents).and_return(:full_backtrace => true)
87
- config = OpenStruct.new
88
- cli_options.apply(config)
89
- config.full_backtrace.should == true
90
- config.formatter.should == 'progress'
91
- end
92
-
93
- it "CLI options trump file options" do
94
- cli_options = Rspec::Core::CommandLineOptions.new(['--formatter', 'progress', '--options', 'spec/spec.opts']).parse
95
- cli_options.stub!(:parse_spec_file_contents).and_return(:formatter => 'documentation')
96
- config = OpenStruct.new
97
- cli_options.apply(config)
98
- config.formatter.should == 'progress'
62
+ options_from_args("--options", "custom/path").should include(:options_file => "custom/path")
63
+ options_from_args("-o", "custom/path").should include(:options_file => "custom/path")
99
64
  end
100
65
  end
101
66
 
@@ -128,5 +93,76 @@ describe Rspec::Core::CommandLineOptions do
128
93
  end
129
94
  end
130
95
 
96
+ describe "options file (override)" do
97
+ let(:config) { OpenStruct.new }
98
+
99
+ it "loads automatically" do
100
+ File.stub(:exist?) { true }
101
+ File.stub(:readlines) { ["--formatter", "doc"] }
102
+
103
+ cli_options = Rspec::Core::ConfigurationOptions.new([])
104
+ cli_options.apply_to(config)
105
+ config.formatter.should == 'doc'
106
+ end
107
+
108
+ it "allows options on one line" do
109
+ File.stub(:exist?) { true }
110
+ File.stub(:readlines) { ["--formatter doc"] }
111
+
112
+ cli_options = Rspec::Core::ConfigurationOptions.new([])
113
+ cli_options.apply_to(config)
114
+ config.formatter.should == 'doc'
115
+ end
116
+
117
+ it "merges options from the global and local .rspec and the command line" do
118
+ File.stub(:exist?){ true }
119
+ File.stub(:readlines) do |path|
120
+ case path
121
+ when ".rspec"
122
+ ["--formatter", "documentation"]
123
+ when /\.rspec/
124
+ ["--line", "37"]
125
+ else
126
+ raise "Unexpected path: #{path}"
127
+ end
128
+ end
129
+ cli_options = Rspec::Core::ConfigurationOptions.new(["--no-color"])
130
+
131
+ cli_options.apply_to(config)
132
+
133
+ config.formatter.should == "documentation"
134
+ config.line_number.should == "37"
135
+ config.color_enabled.should be_false
136
+ end
137
+
138
+ it "prefers local options over global" do
139
+ File.stub(:exist?){ true }
140
+ File.stub(:readlines) do |path|
141
+ case path
142
+ when ".rspec"
143
+ ["--formatter", "local"]
144
+ when /\.rspec/
145
+ ["--formatter", "global"]
146
+ else
147
+ raise "Unexpected path: #{path}"
148
+ end
149
+ end
150
+ cli_options = Rspec::Core::ConfigurationOptions.new([])
151
+
152
+ cli_options.apply_to(config)
153
+
154
+ config.formatter.should == "local"
155
+ end
156
+
157
+ it "prefers CLI options over file options" do
158
+ config_options = Rspec::Core::ConfigurationOptions.new(['--formatter', 'progress'])
159
+ config_options.stub(:parse_options_file).and_return(:formatter => 'documentation')
160
+
161
+ config_options.apply_to(config)
162
+
163
+ config.formatter.should == 'progress'
164
+ end
165
+ end
166
+
131
167
  end
132
168
 
@@ -4,7 +4,7 @@ module Rspec::Core
4
4
 
5
5
  describe Configuration do
6
6
 
7
- let(:config) { Configuration.new }
7
+ let(:config) { subject }
8
8
 
9
9
  describe "#mock_framework_class" do
10
10
  before(:each) do
@@ -237,11 +237,11 @@ module Rspec::Core
237
237
  end
238
238
  end
239
239
 
240
-
241
240
  context "transactional examples" do
242
241
  it "defaults to use transactional examples" do
243
- config.use_transactional_examples?.should be_true
242
+ config.use_transactional_examples?.should be_true
244
243
  end
244
+
245
245
  describe "#use_transactional_examples=" do
246
246
  it "remembers that I don't want transactional exmaples" do
247
247
  config.use_transactional_examples = false
@@ -250,6 +250,13 @@ module Rspec::Core
250
250
  end
251
251
  end
252
252
 
253
+ describe "libs=" do
254
+ it "adds directories to the LOAD_PATH" do
255
+ $LOAD_PATH.should_receive(:unshift).with("a/dir")
256
+ config.libs = ["a/dir"]
257
+ end
258
+ end
259
+
253
260
  end
254
261
 
255
262
  end
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  module Rspec::Core
4
4
 
5
- describe ExampleGroupSubject do
5
+ describe Subject do
6
6
 
7
7
  describe "implicit subject" do
8
8
  describe "with a class" do
@@ -2,7 +2,7 @@ require 'rbconfig'
2
2
 
3
3
  module RubyForker
4
4
  # Forks a ruby interpreter with same type as ourself.
5
- # juby will fork jruby, ruby will fork ruby etc.
5
+ # jruby will fork jruby, ruby will fork ruby etc.
6
6
  def ruby(args, stderr=nil)
7
7
  config = ::Config::CONFIG
8
8
  interpreter = File::join(config['bindir'], config['ruby_install_name']) + config['EXEEXT']
@@ -10,4 +10,4 @@ module RubyForker
10
10
  cmd << " 2> #{stderr}" unless stderr.nil?
11
11
  `#{cmd}`
12
12
  end
13
- end
13
+ end
metadata CHANGED
@@ -7,8 +7,8 @@ version: !ruby/object:Gem::Version
7
7
  - 0
8
8
  - 0
9
9
  - beta
10
- - 5
11
- version: 2.0.0.beta.5
10
+ - 6
11
+ version: 2.0.0.beta.6
12
12
  platform: ruby
13
13
  authors:
14
14
  - Chad Humphries
@@ -17,7 +17,7 @@ autorequire:
17
17
  bindir: bin
18
18
  cert_chain: []
19
19
 
20
- date: 2010-04-04 00:00:00 -03:00
20
+ date: 2010-04-12 00:00:00 -05:00
21
21
  default_executable:
22
22
  dependencies:
23
23
  - !ruby/object:Gem::Dependency
@@ -32,8 +32,8 @@ dependencies:
32
32
  - 0
33
33
  - 0
34
34
  - beta
35
- - 5
36
- version: 2.0.0.beta.5
35
+ - 6
36
+ version: 2.0.0.beta.6
37
37
  type: :development
38
38
  version_requirements: *id001
39
39
  - !ruby/object:Gem::Dependency
@@ -48,8 +48,8 @@ dependencies:
48
48
  - 0
49
49
  - 0
50
50
  - beta
51
- - 5
52
- version: 2.0.0.beta.5
51
+ - 6
52
+ version: 2.0.0.beta.6
53
53
  type: :development
54
54
  version_requirements: *id002
55
55
  - !ruby/object:Gem::Dependency
@@ -92,6 +92,7 @@ extra_rdoc_files:
92
92
  files:
93
93
  - .document
94
94
  - .gitignore
95
+ - .rspec
95
96
  - .treasure_map.rb
96
97
  - License.txt
97
98
  - README.markdown
@@ -153,7 +154,7 @@ files:
153
154
  - features/command_line/example_name_option.feature
154
155
  - features/command_line/line_number_appended_to_path.feature
155
156
  - features/command_line/line_number_option.feature
156
- - features/configuration/spec_opts.feature
157
+ - features/configuration/options_file.feature
157
158
  - features/example_groups/describe_aliases.feature
158
159
  - features/example_groups/nested_groups.feature
159
160
  - features/formatters/custom_formatter.feature
@@ -174,12 +175,11 @@ files:
174
175
  - lib/rspec/core.rb
175
176
  - lib/rspec/core/around_proxy.rb
176
177
  - lib/rspec/core/backward_compatibility.rb
177
- - lib/rspec/core/command_line_options.rb
178
178
  - lib/rspec/core/configuration.rb
179
+ - lib/rspec/core/configuration_options.rb
179
180
  - lib/rspec/core/deprecation.rb
180
181
  - lib/rspec/core/example.rb
181
182
  - lib/rspec/core/example_group.rb
182
- - lib/rspec/core/example_group_subject.rb
183
183
  - lib/rspec/core/formatters.rb
184
184
  - lib/rspec/core/formatters/base_formatter.rb
185
185
  - lib/rspec/core/formatters/base_text_formatter.rb
@@ -200,17 +200,16 @@ files:
200
200
  - lib/rspec/core/ruby_project.rb
201
201
  - lib/rspec/core/runner.rb
202
202
  - lib/rspec/core/shared_example_group.rb
203
- - lib/rspec/core/shared_example_group_kernel_extensions.rb
203
+ - lib/rspec/core/subject.rb
204
204
  - lib/rspec/core/version.rb
205
205
  - lib/rspec/core/world.rb
206
206
  - rspec-core.gemspec
207
207
  - script/console
208
208
  - spec/autotest/failed_results_re_spec.rb
209
209
  - spec/autotest/rspec_spec.rb
210
- - spec/rspec/core/command_line_options_spec.rb
210
+ - spec/rspec/core/configuration_options_spec.rb
211
211
  - spec/rspec/core/configuration_spec.rb
212
212
  - spec/rspec/core/example_group_spec.rb
213
- - spec/rspec/core/example_group_subject_spec.rb
214
213
  - spec/rspec/core/example_spec.rb
215
214
  - spec/rspec/core/formatters/base_formatter_spec.rb
216
215
  - spec/rspec/core/formatters/base_text_formatter_spec.rb
@@ -229,6 +228,7 @@ files:
229
228
  - spec/rspec/core/ruby_project_spec.rb
230
229
  - spec/rspec/core/runner_spec.rb
231
230
  - spec/rspec/core/shared_example_group_spec.rb
231
+ - spec/rspec/core/subject_spec.rb
232
232
  - spec/rspec/core/world_spec.rb
233
233
  - spec/rspec/core_spec.rb
234
234
  - spec/ruby_forker.rb
@@ -242,7 +242,7 @@ licenses: []
242
242
  post_install_message: |
243
243
  **************************************************
244
244
 
245
- Thank you for installing rspec-core-2.0.0.beta.5
245
+ Thank you for installing rspec-core-2.0.0.beta.6
246
246
 
247
247
  This is beta software. If you are looking
248
248
  for a supported production release, please
@@ -276,14 +276,13 @@ rubyforge_project: rspec
276
276
  rubygems_version: 1.3.6
277
277
  signing_key:
278
278
  specification_version: 3
279
- summary: rspec-core-2.0.0.beta.5
279
+ summary: rspec-core-2.0.0.beta.6
280
280
  test_files:
281
281
  - spec/autotest/failed_results_re_spec.rb
282
282
  - spec/autotest/rspec_spec.rb
283
- - spec/rspec/core/command_line_options_spec.rb
283
+ - spec/rspec/core/configuration_options_spec.rb
284
284
  - spec/rspec/core/configuration_spec.rb
285
285
  - spec/rspec/core/example_group_spec.rb
286
- - spec/rspec/core/example_group_subject_spec.rb
287
286
  - spec/rspec/core/example_spec.rb
288
287
  - spec/rspec/core/formatters/base_formatter_spec.rb
289
288
  - spec/rspec/core/formatters/base_text_formatter_spec.rb
@@ -302,6 +301,7 @@ test_files:
302
301
  - spec/rspec/core/ruby_project_spec.rb
303
302
  - spec/rspec/core/runner_spec.rb
304
303
  - spec/rspec/core/shared_example_group_spec.rb
304
+ - spec/rspec/core/subject_spec.rb
305
305
  - spec/rspec/core/world_spec.rb
306
306
  - spec/rspec/core_spec.rb
307
307
  - spec/ruby_forker.rb
@@ -1,93 +0,0 @@
1
- require 'optparse'
2
- # http://www.ruby-doc.org/stdlib/libdoc/optparse/rdoc/classes/OptionParser.html
3
-
4
- module Rspec
5
- module Core
6
-
7
- class CommandLineOptions
8
- DEFAULT_OPTIONS_FILE = 'spec/spec.opts'
9
-
10
- attr_reader :args, :options
11
-
12
- def self.parse(args)
13
- new(args).parse
14
- end
15
-
16
- def initialize(args)
17
- @args = args
18
- @options = {}
19
- end
20
-
21
- def parse
22
- options[:files_or_directories_to_run] = OptionParser.new do |opts|
23
- opts.banner = "Usage: rspec [options] [files or directories]"
24
-
25
- opts.on('-c', '--[no-]color', '--[no-]colour', 'Enable color in the output') do |o|
26
- options[:color_enabled] = o
27
- end
28
-
29
- opts.on('-f', '--formatter [FORMATTER]', 'Choose a formatter',
30
- ' [p]rogress (default - dots)',
31
- ' [d]ocumentation (group and example names)') do |o|
32
- options[:formatter] = o
33
- end
34
-
35
- opts.on('-l', '--line_number [LINE]', 'Specify the line number of a single example to run') do |o|
36
- options[:line_number] = o
37
- end
38
-
39
- opts.on('-e', '--example [PATTERN]', "Run examples whose full descriptions match this pattern",
40
- "(PATTERN is compiled into a Ruby regular expression)") do |o|
41
- options[:full_description] = /#{o}/
42
- end
43
-
44
- opts.on('-o', '--options [PATH]', 'Read configuration options from a file path. (Defaults to spec/spec.opts)') do |o|
45
- options[:options_file] = o || DEFAULT_OPTIONS_FILE
46
- end
47
-
48
- opts.on('-p', '--profile', 'Enable profiling of examples with output of the top 10 slowest examples') do |o|
49
- options[:profile_examples] = o
50
- end
51
-
52
- opts.on('-b', '--backtrace', 'Enable full backtrace') do |o|
53
- options[:full_backtrace] = true
54
- end
55
-
56
- opts.on('-d', '--debug', 'Enable debugging') do |o|
57
- options[:debug] = true
58
- end
59
-
60
- opts.on_tail('-h', '--help', "You're looking at it.") do
61
- puts opts
62
- exit
63
- end
64
- end.parse!(@args)
65
-
66
- self
67
- end
68
-
69
- def apply(config)
70
- # 1) option file, cli options, rspec core configure
71
- # TODO: Add options_file to configuration
72
- # TODO: Store command line options for reference
73
- options_file = options.delete(:options_file) || DEFAULT_OPTIONS_FILE
74
- merged_options = parse_spec_file_contents(options_file).merge!(options)
75
- options.replace merged_options
76
-
77
- options.each do |key, value|
78
- config.send("#{key}=", value)
79
- end
80
- end
81
-
82
- private
83
-
84
- def parse_spec_file_contents(options_file)
85
- return {} unless File.exist?(options_file)
86
- spec_file_contents = File.readlines(options_file).map {|l| l.split}.flatten
87
- self.class.new(spec_file_contents).parse.options
88
- end
89
-
90
- end
91
-
92
- end
93
- end
@@ -1,31 +0,0 @@
1
- module Rspec
2
- module Core
3
- module SharedExampleGroupKernelExtensions
4
-
5
- def share_examples_for(name, &block)
6
- Rspec::Core.world.shared_example_groups[name] = block
7
- end
8
-
9
- def share_as(name, &block)
10
- if Object.const_defined?(name)
11
- puts "name was defined as #{name.inspect}"
12
- raise NameError, "The first argument (#{name}) to share_as must be a legal name for a constant not already in use."
13
- end
14
-
15
- mod = Module.new do
16
- @shared_block = block
17
-
18
- def self.included(kls)
19
- kls.module_eval(&@shared_block)
20
- end
21
- end
22
-
23
- shared_const = Object.const_set(name, mod)
24
- Rspec::Core.world.shared_example_groups[shared_const] = block
25
- end
26
-
27
- alias :shared_examples_for :share_examples_for
28
-
29
- end
30
- end
31
- end