aslakhellesoy-cucumber 0.1.4 → 0.1.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.
Files changed (99) hide show
  1. metadata +14 -2
  2. data/History.txt +0 -4
  3. data/License.txt +0 -20
  4. data/Manifest.txt +0 -98
  5. data/README.txt +0 -42
  6. data/Rakefile +0 -4
  7. data/TODO.txt +0 -30
  8. data/bin/cucumber +0 -3
  9. data/config/hoe.rb +0 -69
  10. data/config/requirements.rb +0 -15
  11. data/examples/calculator/Rakefile +0 -6
  12. data/examples/calculator/features/addition.feature +0 -16
  13. data/examples/calculator/features/division.feature +0 -11
  14. data/examples/calculator/features/steps/calculator_steps.rb +0 -30
  15. data/examples/calculator/lib/calculator.rb +0 -16
  16. data/examples/calculator_ruby_features/Rakefile +0 -6
  17. data/examples/calculator_ruby_features/features/addition.rb +0 -23
  18. data/examples/calculator_ruby_features/features/steps/calculator_steps.rb +0 -43
  19. data/examples/java/README.textile +0 -22
  20. data/examples/java/Rakefile +0 -12
  21. data/examples/java/features/hello.feature +0 -11
  22. data/examples/java/features/steps/hello_steps.rb +0 -25
  23. data/examples/java/features/steps/tree_steps.rb +0 -14
  24. data/examples/java/features/tree.feature +0 -9
  25. data/examples/java/src/cucumber/demo/Hello.java +0 -15
  26. data/examples/norwegian_calculator/Rakefile +0 -6
  27. data/examples/norwegian_calculator/features/kalkulator_steps.rb +0 -31
  28. data/examples/norwegian_calculator/features/summering.feature +0 -13
  29. data/examples/watir/Rakefile +0 -6
  30. data/examples/watir/features/search.feature +0 -9
  31. data/examples/watir/features/steps/stories_steps.rb +0 -51
  32. data/gem_tasks/deployment.rake +0 -34
  33. data/gem_tasks/environment.rake +0 -7
  34. data/gem_tasks/fix_cr_lf.rake +0 -10
  35. data/gem_tasks/gemspec.rake +0 -6
  36. data/gem_tasks/rspec.rake +0 -21
  37. data/gem_tasks/treetop.rake +0 -27
  38. data/gem_tasks/website.rake +0 -17
  39. data/generators/cucumber/cucumber_generator.rb +0 -20
  40. data/generators/cucumber/templates/common_webrat.rb +0 -30
  41. data/generators/cucumber/templates/cucumber.rake +0 -7
  42. data/generators/cucumber/templates/env.rb +0 -6
  43. data/generators/feature/feature_generator.rb +0 -17
  44. data/generators/feature/templates/feature.erb +0 -27
  45. data/generators/feature/templates/steps.erb +0 -22
  46. data/lib/cucumber/cli.rb +0 -133
  47. data/lib/cucumber/core_ext/proc.rb +0 -43
  48. data/lib/cucumber/core_ext/string.rb +0 -17
  49. data/lib/cucumber/executor.rb +0 -79
  50. data/lib/cucumber/formatters/ansicolor.rb +0 -89
  51. data/lib/cucumber/formatters/html_formatter.rb +0 -272
  52. data/lib/cucumber/formatters/pretty_formatter.rb +0 -129
  53. data/lib/cucumber/formatters/progress_formatter.rb +0 -41
  54. data/lib/cucumber/formatters.rb +0 -1
  55. data/lib/cucumber/languages.yml +0 -31
  56. data/lib/cucumber/rails/rspec.rb +0 -12
  57. data/lib/cucumber/rails/world.rb +0 -71
  58. data/lib/cucumber/rake/task.rb +0 -75
  59. data/lib/cucumber/step_methods.rb +0 -41
  60. data/lib/cucumber/step_mother.rb +0 -38
  61. data/lib/cucumber/tree/feature.rb +0 -45
  62. data/lib/cucumber/tree/features.rb +0 -21
  63. data/lib/cucumber/tree/scenario.rb +0 -85
  64. data/lib/cucumber/tree/step.rb +0 -141
  65. data/lib/cucumber/tree/table.rb +0 -26
  66. data/lib/cucumber/tree/top_down_visitor.rb +0 -23
  67. data/lib/cucumber/tree.rb +0 -18
  68. data/lib/cucumber/treetop_parser/feature.treetop.erb +0 -102
  69. data/lib/cucumber/treetop_parser/feature_en.rb +0 -974
  70. data/lib/cucumber/treetop_parser/feature_fr.rb +0 -974
  71. data/lib/cucumber/treetop_parser/feature_no.rb +0 -974
  72. data/lib/cucumber/treetop_parser/feature_parser.rb +0 -32
  73. data/lib/cucumber/treetop_parser/feature_pt.rb +0 -974
  74. data/lib/cucumber/version.rb +0 -9
  75. data/lib/cucumber.rb +0 -32
  76. data/script/console +0 -10
  77. data/script/console.cmd +0 -1
  78. data/script/destroy +0 -14
  79. data/script/destroy.cmd +0 -1
  80. data/script/generate +0 -14
  81. data/script/generate.cmd +0 -1
  82. data/script/txt2html +0 -74
  83. data/script/txt2html.cmd +0 -1
  84. data/setup.rb +0 -1585
  85. data/spec/cucumber/core_ext/string_spec.rb +0 -20
  86. data/spec/cucumber/executor_spec.rb +0 -55
  87. data/spec/cucumber/formatters/ansicolor_spec.rb +0 -18
  88. data/spec/cucumber/formatters/features.html +0 -274
  89. data/spec/cucumber/formatters/html_formatter_spec.rb +0 -59
  90. data/spec/cucumber/sell_cucumbers.feature +0 -9
  91. data/spec/cucumber/treetop_parser/feature_parser_spec.rb +0 -40
  92. data/spec/cucumber/treetop_parser/spaces.feature +0 -10
  93. data/spec/spec.opts +0 -2
  94. data/spec/spec_helper.rb +0 -14
  95. data/website/index.html +0 -11
  96. data/website/index.txt +0 -39
  97. data/website/javascripts/rounded_corners_lite.inc.js +0 -285
  98. data/website/stylesheets/screen.css +0 -138
  99. data/website/template.html.erb +0 -48
@@ -1,31 +0,0 @@
1
- # http://en.wikipedia.org/wiki/IETF_language_tag
2
- # http://www.iana.org/assignments/language-subtag-registry
3
- # http://ftp.ics.uci.edu/pub/ietf/http/related/iso639.txt (Use this I think)
4
- "en":
5
- scenario: Scenario
6
- given_scenario: GivenScenario
7
- given: Given
8
- when: When
9
- then: Then
10
- and: And
11
- "no":
12
- scenario: Scenario
13
- given_scenario: GittScenario
14
- given: Gitt
15
- when: Når
16
- then: Så
17
- and: Og
18
- "fr":
19
- scenario: Scenario
20
- given_scenario: SoitScenario
21
- given: Soit
22
- when: Lorsque
23
- then: Alors
24
- and: Et
25
- "pt":
26
- scenario: Escenario
27
- given_scenario: DadoElEscenario
28
- given: Dado
29
- when: Cuando
30
- then: Entonces
31
- and: Y
@@ -1,12 +0,0 @@
1
- require 'spec'
2
- require 'spec/rails'
3
-
4
- # Hack to stop RSpec from dumping the summary
5
- Spec::Runner::Options.class_eval do
6
- def examples_should_be_run?
7
- false
8
- end
9
- end
10
-
11
- ActionController::Integration::Session.send(:include, Spec::Matchers)
12
- ActionController::Integration::Session.send(:include, Spec::Rails::Matchers)
@@ -1,71 +0,0 @@
1
- # Based on code from Brian Takita, Yurii Rashkovskii and Ben Mabey
2
- # Adapted by Aslak Hellesøy
3
-
4
- if defined?(ActiveRecord::Base)
5
- require 'test_help'
6
- else
7
- require 'action_controller/test_process'
8
- require 'action_controller/integration'
9
- end
10
- require 'test/unit/testresult'
11
-
12
- # These allow exceptions to come through as opposed to being caught and hvaing non-helpful responses returned.
13
- ActionController::Base.class_eval do
14
- def perform_action
15
- perform_action_without_rescue
16
- end
17
- end
18
- Dispatcher.class_eval do
19
- def self.failsafe_response(output, status, exception = nil)
20
- raise exception
21
- end
22
- end
23
-
24
- # So that Test::Unit doesn't launch at the end - makes it think it has already been run.
25
- Test::Unit.run = true
26
-
27
- module Cucumber #:nodoc:
28
- module Rails
29
- # All scenarios will execute in the context of a new instance of World.
30
- class World < ActionController::IntegrationTest
31
- if defined?(ActiveRecord::Base)
32
- self.use_transactional_fixtures = true
33
- else
34
- def self.fixture_table_names; []; end # Workaround for projects that don't use ActiveRecord
35
- end
36
-
37
- def initialize #:nodoc:
38
- @_result = Test::Unit::TestResult.new
39
- end
40
- end
41
- end
42
- end
43
-
44
- World do
45
- Cucumber::Rails::World.new
46
- end
47
-
48
- if defined?(ActiveRecord::Base)
49
- Before do
50
- if defined?(ActiveRecord::Base)
51
- if ActiveRecord::Base.connection.respond_to?(:increment_open_transactions)
52
- ActiveRecord::Base.connection.increment_open_transactions
53
- else
54
- ActiveRecord::Base.send :increment_open_transactions
55
- end
56
- end
57
- ActiveRecord::Base.connection.begin_db_transaction
58
- ActionMailer::Base.deliveries = [] if defined?(ActionMailer::Base)
59
- end
60
-
61
- After do
62
- if defined?(ActiveRecord::Base)
63
- ActiveRecord::Base.connection.rollback_db_transaction
64
- if ActiveRecord::Base.connection.respond_to?(:decrement_open_transactions)
65
- ActiveRecord::Base.connection.decrement_open_transactions
66
- else
67
- ActiveRecord::Base.send :decrement_open_transactions
68
- end
69
- end
70
- end
71
- end
@@ -1,75 +0,0 @@
1
- module Cucumber
2
- module Rake
3
- # Defines a task for running features.
4
- class Task
5
- LIB = File.expand_path(File.dirname(__FILE__) + '/../..')
6
- BINARY = File.expand_path(File.dirname(__FILE__) + '/../../../bin/cucumber')
7
-
8
- attr_accessor :libs
9
- attr_accessor :step_list
10
- attr_accessor :step_pattern
11
- attr_accessor :feature_list
12
- attr_accessor :feature_pattern
13
- attr_accessor :cucumber_opts
14
- attr_accessor :rcov
15
- attr_accessor :rcov_opts
16
-
17
- # Define a task
18
- def initialize(task_name = "features", desc = "Run Features")
19
- @task_name, @desc = task_name, desc
20
- @libs = []
21
- @rcov_opts = %w{--rails --exclude osx\/objc,gems\/}
22
-
23
- yield self if block_given?
24
-
25
- @feature_pattern = "features/**/*.feature" if feature_pattern.nil? && feature_list.nil?
26
- @step_pattern = "features/**/*.rb" if step_pattern.nil? && step_list.nil?
27
- define_tasks
28
- end
29
-
30
- def define_tasks
31
- desc @desc
32
- task @task_name do
33
- lib_args = ['"%s"' % ([LIB] + libs).join(File::PATH_SEPARATOR)]
34
- cucumber_bin = ['"%s"' % BINARY]
35
- cuc_opts = [(ENV['CUCUMBER_OPTS'] || cucumber_opts)]
36
-
37
- step_files.each do |step_file|
38
- cuc_opts << '--require'
39
- cuc_opts << step_file
40
- end
41
-
42
- if rcov
43
- args = (['-I'] + lib_args + ['-S', 'rcov'] + rcov_opts + cucumber_bin + ['--'] + cuc_opts + feature_files).flatten
44
- else
45
- args = (['-I'] + lib_args + cucumber_bin + cuc_opts + feature_files).flatten
46
- end
47
- ruby(args.join(" ")) # ruby(*args) is broken on Windows
48
- end
49
- end
50
-
51
-
52
- def feature_files # :nodoc:
53
- if ENV['FEATURE']
54
- FileList[ ENV['FEATURE'] ]
55
- else
56
- result = []
57
- result += feature_list.to_a if feature_list
58
- result += FileList[feature_pattern].to_a if feature_pattern
59
- FileList[result]
60
- end
61
- end
62
-
63
- def step_files # :nodoc:
64
- if ENV['STEPS']
65
- FileList[ ENV['STEPS'] ]
66
- else
67
- result = []
68
- result += step_list.to_a if step_list
69
- result += FileList[step_pattern].to_a if step_pattern
70
- FileList[result]
71
- end
72
- end
73
- end
74
- end
75
- end
@@ -1,41 +0,0 @@
1
- require 'cucumber/step_mother'
2
-
3
- module Cucumber
4
- # Defines "global" methods that may be used in *_steps.rb files.
5
- module StepMethods
6
- # Each scenario will execute in the context of what the supplied block returns.
7
- def World(&proc)
8
- $executor.register_world_proc(&proc)
9
- end
10
-
11
- def Before(&proc)
12
- $executor.register_before_proc(&proc)
13
- end
14
-
15
- def After(&proc)
16
- $executor.register_after_proc(&proc)
17
- end
18
-
19
- def Given(key, &proc)
20
- step_mother.register_step_proc(key, &proc)
21
- end
22
-
23
- def When(key, &proc)
24
- step_mother.register_step_proc(key, &proc)
25
- end
26
-
27
- def Then(key, &proc)
28
- step_mother.register_step_proc(key, &proc)
29
- end
30
-
31
- # Simple workaround for old skool steps
32
- def steps_for(*_)
33
- STDERR.puts "WARNING: In Cucumber the steps_for method is obsolete"
34
- yield
35
- end
36
-
37
- def step_mother #:nodoc:
38
- @step_mother ||= StepMother.new
39
- end
40
- end
41
- end
@@ -1,38 +0,0 @@
1
- require 'cucumber/tree/top_down_visitor'
2
- require 'cucumber/core_ext/proc'
3
-
4
- module Cucumber
5
- # A StepMother keeps track of step procs and assigns them
6
- # to each step when visiting the tree.
7
- class StepMother < Tree::TopDownVisitor
8
- def initialize
9
- @step_procs = {}
10
- end
11
-
12
- def register_step_proc(key, &proc)
13
- regexp = case(key)
14
- when String
15
- Regexp.new("^#{key}$") # TODO: replace $variable with (.*)
16
- when Regexp
17
- key
18
- else
19
- raise "Step patterns must be Regexp or String, but was: #{key.inspect}"
20
- end
21
- proc.extend(CoreExt::CallIn)
22
- proc.name = key.inspect
23
- @step_procs[regexp] = proc
24
- end
25
-
26
- def visit_step(step)
27
- # Maybe we shouldn't attach the regexp etc to
28
- # the step? Maybe steps pull them out as needed?
29
- # Do we then have to attach ourself to the step instead?
30
- # What would we gain from a pull design?
31
- @step_procs.each do |regexp, proc|
32
- if step.respond_to?(:name) && step.name =~ regexp
33
- step.attach(regexp, proc, $~.captures)
34
- end
35
- end
36
- end
37
- end
38
- end
@@ -1,45 +0,0 @@
1
- module Cucumber
2
- module Tree
3
- class Feature
4
- attr_accessor :file
5
-
6
- def initialize(header, &proc)
7
- @header = header
8
- @scenarios = []
9
- instance_eval(&proc) if block_given?
10
- end
11
-
12
- def add_scenario(name, &proc)
13
- scenario = Scenario.new(self, name, &proc)
14
- @scenarios << scenario
15
- scenario
16
- end
17
-
18
- def add_row_scenario(template_scenario, values, line)
19
- scenario = RowScenario.new(self, template_scenario, values, line)
20
- @scenarios << scenario
21
- scenario
22
- end
23
-
24
- def Scenario(name, &proc)
25
- add_scenario(name, &proc)
26
- end
27
-
28
- def Table(matrix = [], &proc)
29
- table = Table.new(matrix)
30
- proc.call(table)
31
- template_scenario = @scenarios.last
32
- matrix[1..-1].each do |row|
33
- @scenarios << RowScenario.new(self, template_scenario, row, row.line)
34
- end
35
- end
36
-
37
- def accept(visitor)
38
- visitor.visit_header(@header)
39
- @scenarios.each do |scenario|
40
- visitor.visit_scenario(scenario)
41
- end
42
- end
43
- end
44
- end
45
- end
@@ -1,21 +0,0 @@
1
- module Cucumber
2
- module Tree
3
- class Features
4
- def initialize
5
- @features = []
6
- end
7
-
8
- def length
9
- @features.length
10
- end
11
-
12
- def <<(feature)
13
- @features << feature
14
- end
15
-
16
- def accept(visitor)
17
- @features.each{|feature| visitor.visit_feature(feature)}
18
- end
19
- end
20
- end
21
- end
@@ -1,85 +0,0 @@
1
- module Cucumber
2
- module Tree
3
- class BaseScenario
4
- def file
5
- @feature.file
6
- end
7
-
8
- def accept(visitor)
9
- steps.each do |step|
10
- visitor.visit_step(step)
11
- end
12
- end
13
-
14
- def at_line?(l)
15
- line == l || steps.map{|s| s.line}.index(l)
16
- end
17
-
18
- def previous_step(step)
19
- i = steps.index(step)
20
- raise "Couldn't find #{step} among #{steps}" if i.nil?
21
- steps[i-1]
22
- end
23
- end
24
-
25
- class Scenario < BaseScenario
26
-
27
- # If a table follows, the header will be stored here. Weird, but convenient.
28
- attr_accessor :table_header
29
-
30
- def initialize(feature, name, &proc)
31
- @feature, @name = feature, name
32
- @steps = []
33
- instance_eval(&proc) if block_given?
34
- end
35
-
36
- def row?
37
- false
38
- end
39
-
40
- def add_step(keyword, name, line)
41
- @steps << Step.new(self, keyword, name, line)
42
- end
43
-
44
- def Given(name)
45
- add_step('Given', name, *caller[0].split(':')[1].to_i)
46
- end
47
-
48
- def When(name)
49
- add_step('When', name, *caller[0].split(':')[1].to_i)
50
- end
51
-
52
- def Then(name)
53
- add_step('Then', name, *caller[0].split(':')[1].to_i)
54
- end
55
-
56
- def And(name)
57
- add_step('And', name, *caller[0].split(':')[1].to_i)
58
- end
59
-
60
- attr_reader :name, :steps, :line
61
-
62
- end
63
-
64
- class RowScenario < BaseScenario
65
- attr_reader :line
66
-
67
- def initialize(feature, template_scenario, values, line)
68
- @feature, @template_scenario, @values, @line = feature, template_scenario, values, line
69
- end
70
-
71
- def row?
72
- true
73
- end
74
-
75
- def steps
76
- @steps ||= @template_scenario.steps.map do |template_step|
77
- args = template_step.args.map do
78
- @values.shift
79
- end
80
- RowStep.new(self, template_step.keyword, template_step.proc, args)
81
- end
82
- end
83
- end
84
- end
85
- end
@@ -1,141 +0,0 @@
1
- module Cucumber
2
- module Tree
3
- class BaseStep
4
- def self.new_id!
5
- @next_id ||= -1
6
- @next_id += 1
7
- end
8
-
9
- attr_reader :error
10
- attr_accessor :args
11
-
12
- def file
13
- @scenario.file
14
- end
15
-
16
- def regexp
17
- @regexp || //
18
- end
19
-
20
- PENDING = lambda do |*_|
21
- raise Pending
22
- end
23
- PENDING.extend(CoreExt::CallIn)
24
- PENDING.name = "PENDING"
25
-
26
- def proc
27
- @proc || PENDING
28
- end
29
-
30
- def attach(regexp, proc, args)
31
- if @regexp
32
- raise <<-EOM
33
- "#{name}" matches several step definitions:
34
-
35
- #{@proc.backtrace_line}
36
- #{proc.backtrace_line}
37
-
38
- Please give your steps unambiguous names
39
- EOM
40
- end
41
- @regexp, @proc, @args = regexp, proc, args
42
- end
43
-
44
- if defined?(JRUBY_VERSION)
45
- PENDING_ADJUSTMENT = 2
46
- REGULAR_ADJUSTMENT = 1
47
- else
48
- PENDING_ADJUSTMENT = 3
49
- REGULAR_ADJUSTMENT = 2
50
- end
51
-
52
- def execute_in(world)
53
- strip_pos = nil
54
- begin
55
- proc.call_in(world, *@args)
56
- rescue ArgCountError => e
57
- e.backtrace[0] = @proc.backtrace_line
58
- strip_pos = e.backtrace.index("#{__FILE__}:#{__LINE__ - 3}:in `execute_in'")
59
- format_error(strip_pos, e)
60
- rescue => e
61
- method_line = "#{__FILE__}:#{__LINE__ - 6}:in `execute_in'"
62
- method_line_pos = e.backtrace.index(method_line)
63
- if method_line_pos
64
- strip_pos = method_line_pos - (Pending === e ? PENDING_ADJUSTMENT : REGULAR_ADJUSTMENT)
65
- else
66
- # This happens with rails, because they screw up the backtrace
67
- # before we get here (injecting erb stactrace and such)
68
- end
69
- format_error(strip_pos, e)
70
- end
71
- end
72
-
73
- def format_error(strip_pos, e)
74
- @error = e
75
- # Remove lines underneath the plain text step
76
- e.backtrace[strip_pos..-1] = nil unless strip_pos.nil?
77
- e.backtrace.flatten
78
- # Replace the step line with something more readable
79
- e.backtrace.replace(e.backtrace.map{|l| l.gsub(/`#{proc.meth}'/, "`#{keyword} #{proc.name}'")})
80
- if row?
81
- e.backtrace << "#{file}:#{line}:in `#{proc.name}'"
82
- else
83
- e.backtrace << "#{file}:#{line}:in `#{keyword} #{name}'"
84
- end
85
- raise e
86
- end
87
-
88
- def id
89
- @id ||= self.class.new_id!
90
- end
91
-
92
- def actual_keyword
93
- keyword == Cucumber.language['and'] ? previous_step.actual_keyword : keyword
94
- end
95
-
96
- def previous_step
97
- @scenario.previous_step(self)
98
- end
99
- end
100
-
101
- class Step < BaseStep
102
- attr_accessor :error
103
-
104
- def row?
105
- false
106
- end
107
-
108
- def initialize(scenario, keyword, name, line)
109
- @scenario, @keyword, @name, @line = scenario, keyword, name, line
110
- @args = []
111
- end
112
-
113
- def gzub(format=nil, &proc)
114
- name.gzub(regexp, format, &proc)
115
- end
116
-
117
- attr_reader :keyword, :name, :line
118
- end
119
-
120
- class RowStep < BaseStep
121
- attr_reader :keyword
122
-
123
- def initialize(scenario, keyword, proc, args)
124
- @scenario, @keyword, @proc, @args = scenario, keyword, proc, args
125
- end
126
-
127
- def gzub(format=nil, &proc)
128
- raise "WWW"
129
- end
130
-
131
- def row?
132
- true
133
- end
134
-
135
- def line
136
- @scenario.line
137
- end
138
- end
139
-
140
- end
141
- end
@@ -1,26 +0,0 @@
1
- module Cucumber
2
- module Tree
3
- class Table
4
- def initialize(rows)
5
- @rows = rows
6
- end
7
-
8
- def |(cell)
9
- @row ||= []
10
- if cell == self
11
- l = *caller[0].split(':')[1].to_i
12
- @row.instance_eval %{
13
- def line
14
- #{l}
15
- end
16
- }
17
- @rows << @row
18
- @row = nil
19
- else
20
- @row << cell.to_s
21
- end
22
- self
23
- end
24
- end
25
- end
26
- end
@@ -1,23 +0,0 @@
1
- module Cucumber
2
- module Tree
3
- class TopDownVisitor
4
- def visit_features(features)
5
- features.accept(self)
6
- end
7
-
8
- def visit_feature(feature)
9
- feature.accept(self)
10
- end
11
-
12
- def visit_header(header)
13
- end
14
-
15
- def visit_scenario(scenario)
16
- scenario.accept(self)
17
- end
18
-
19
- def visit_step(step)
20
- end
21
- end
22
- end
23
- end
data/lib/cucumber/tree.rb DELETED
@@ -1,18 +0,0 @@
1
- %w{features feature scenario step table top_down_visitor}.each{|f| require "cucumber/tree/#{f}"}
2
- require 'cucumber/core_ext/proc'
3
- require 'cucumber/core_ext/string'
4
-
5
- module Cucumber
6
- module Tree
7
- def Feature(header, &proc)
8
- feature = Feature.new("Feature: " + header, &proc)
9
- feature.file, _, _ = *caller[0].split(':')
10
- features << feature
11
- feature
12
- end
13
-
14
- def features #:nodoc:
15
- @features ||= Tree::Features.new
16
- end
17
- end
18
- end