aslakhellesoy-cucumber 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
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