cuketagger 1.4 → 1.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,34 +2,20 @@ module CukeTagger
2
2
  module TagFormatter
3
3
  attr_accessor :tagger
4
4
 
5
- def before_feature(feature)
6
- @__current_feature = feature
5
+ def feature(feature)
6
+ @tagger.process @uri, feature
7
7
  super
8
8
  end
9
9
 
10
- def before_feature_element(element)
11
- @__current_element = element
12
- super
13
- end
14
-
15
- def after_feature_element(element)
16
- @__current_element = nil
10
+ def scenario_outline(scenario_outline)
11
+ @tagger.process @uri, scenario_outline
17
12
  super
18
13
  end
19
14
 
20
- def before_tags(tags)
21
- @tagger.process(@__current_feature, @__current_element, tags.instance_variable_get("@tag_names"))
15
+ def scenario(scenario)
16
+ @tagger.process @uri, scenario
17
+ super
22
18
  end
23
19
 
24
- private
25
-
26
- def record_tag_occurrences(*args)
27
- # override to avoid error if options[:include_tags] is nil
28
- end
29
-
30
- def print_summary(*args)
31
- # override
32
- end
33
-
34
20
  end
35
21
  end
@@ -1,5 +1,3 @@
1
- require "cucumber/cli/options"
2
-
3
1
  module CukeTagger
4
2
  class Tagger
5
3
  USAGE = "#{File.basename $0} [-v|--version] [-f|--force] [add|remove|replace]:TAG[:REPLACEMENT] [FILE[:LINE]]+"
@@ -12,22 +10,20 @@ module CukeTagger
12
10
  abort(USAGE) if args.empty? || args.first =~ /^(-h|--help)$/
13
11
  CukeTagger.log :args, args
14
12
 
15
- cuke_args = %w[--dry-run]
13
+ force = false
16
14
 
17
15
  args.each do |arg|
18
16
  case arg
19
17
  when /^-v|--version$/
20
18
  puts CukeTagger::Version
21
19
  when /^(.+?\.feature)((:\d+)*)$/
22
- add_feature($1, $2.to_s)
20
+ add_feature $1, $2.to_s
23
21
  when /^(add|remove):(.+?)$/
24
22
  alterations << [$1.to_sym, $2]
25
23
  when /^(replace):(.+?):(.+)$/
26
24
  alterations << [$1.to_sym, [$2, $3]]
27
25
  when /^(-f|--force)$/
28
- cuke_args << "--autoformat" << "."
29
- cuke_args << "--no-source"
30
- Term::ANSIColor.coloring = false
26
+ force = true
31
27
  else
32
28
  abort(USAGE)
33
29
  end
@@ -37,83 +33,89 @@ module CukeTagger
37
33
 
38
34
  CukeTagger.log :alterations, alterations
39
35
 
40
- configuration = Cucumber::Cli::Configuration.new
41
- configuration.parse!(cuke_args)
42
-
43
- formatter = Cucumber::Formatter::Pretty.new(runtime, $stdout, configuration.instance_variable_get("@options"))
44
- formatter.extend(TagFormatter)
45
- formatter.tagger = self
36
+ files = features_to_change.map { |file, line| file }.uniq
37
+ files.each { |file| parse file, force }
38
+ end
46
39
 
47
- walker = Cucumber::Ast::TreeWalker.new(runtime, [formatter], configuration)
48
- walker.visit_features features
40
+ def parse(file, write)
41
+ content = File.read(file)
42
+
43
+ io = write ? File.open(file, "w") : $stdout
44
+ begin
45
+ pretty_formatter = Gherkin::Formatter::PrettyFormatter.new(io,
46
+ !(io == $stdout && $stdout.tty?), # monochrome
47
+ false) # executing
48
+ pretty_formatter.extend TagFormatter
49
+ pretty_formatter.tagger = self
50
+
51
+ parser = Gherkin::Parser::Parser.new(pretty_formatter, true)
52
+ parser.parse content, file, 0
53
+ ensure
54
+ io.close unless io == $stdout
55
+ end
49
56
  end
50
57
 
51
- def process(feature, element, tag_names)
58
+ def process(uri, element)
52
59
  CukeTagger.log :process, :element => element.class
53
- return unless should_alter?(feature, element)
60
+ return unless should_alter?(uri, element)
61
+
62
+ @uri = uri
54
63
 
55
64
  alterations.each do |op, tag_name|
56
65
  case op
57
66
  when :add
58
- tag_names.push "@#{tag_name}"
67
+ push_tag element, "@#{tag_name}"
59
68
  when :remove
60
- tag_names.delete "@#{tag_name}"
69
+ remove_tag element, "@#{tag_name}"
61
70
  when :replace
62
- idx = tag_names.index "@#{tag_name.first}"
63
- if idx.nil?
64
- $stderr.puts "expected #{tag_name.first.inspect} at #{file_and_line_for(feature, element).join(":")}, skipping"
65
- else
66
- tag_names[idx] = "@#{tag_name.last}"
67
- end
71
+ replace_tag element, tag_name
68
72
  end
69
73
  end
70
74
  end
71
75
 
72
- def should_alter?(feature, element)
73
- fl = file_and_line_for(feature, element)
74
-
75
- CukeTagger.log(:file_and_line => fl, :features_to_change => features_to_change)
76
+ def push_tag(element, tag_name)
77
+ element.tags << Gherkin::Formatter::Model::Tag.new(tag_name, element.line)
78
+ end
76
79
 
77
- features_to_change.include? fl
80
+ def remove_tag(element, tag_name)
81
+ element.tags.delete_if { |tag| tag.name == tag_name }
78
82
  end
79
83
 
80
- private
84
+ def replace_tag(element, tag_name)
85
+ to_replace, replacement = tag_name
86
+ to_replace = "@#{to_replace}"
87
+ replacement = "@#{replacement}"
81
88
 
82
- def file_and_line_for(feature, element)
83
- line = if element.respond_to?(:line)
84
- element.line
85
- elsif element.kind_of?(Cucumber::Ast::ScenarioOutline)
86
- element.instance_variable_get("@line")
87
- else
88
- 0
89
- end
89
+ idx = element.tags.find_index { |tag| tag.name == to_replace }
90
90
 
91
- [feature.file, line]
91
+ if idx.nil?
92
+ $stderr.puts "expected #{to_replace.inspect} at #{@uri}:#{element.line}, skipping"
93
+ else
94
+ element.tags[idx] = Gherkin::Formatter::Model::Tag.new(replacement, element.line)
95
+ end
92
96
  end
93
97
 
94
- def add_feature(path, lines)
95
- ff = Cucumber::FeatureFile.new(path).parse({}, {})
98
+ def should_alter?(uri, element)
99
+ CukeTagger.log(:file_and_line => [uri, element.line], :features_to_change => features_to_change)
96
100
 
101
+ features_to_change.any? do |file, line|
102
+ file == uri && (element.line == line || (line.nil? && element.kind_of?(Gherkin::Formatter::Model::Feature)))
103
+ end
104
+ end
105
+
106
+ private
107
+
108
+ def add_feature(path, lines)
97
109
  lines = lines.split(":")
98
- lines.delete("")
110
+ lines.delete ""
99
111
 
100
112
  if lines.empty?
101
- features_to_change << [path, 0]
113
+ features_to_change << [path, nil]
102
114
  else
103
115
  lines.each do |line|
104
116
  features_to_change << [path, Integer(line)]
105
117
  end
106
118
  end
107
-
108
- features.add_feature ff
109
- end
110
-
111
- def runtime
112
- @runtime ||= Cucumber::Runtime.new
113
- end
114
-
115
- def features
116
- @features ||= Cucumber::Ast::Features.new
117
119
  end
118
120
 
119
121
  def alterations
@@ -1,3 +1,3 @@
1
1
  module CukeTagger
2
- Version = "1.4"
2
+ Version = "1.5"
3
3
  end
data/lib/cuketagger.rb CHANGED
@@ -1,10 +1,11 @@
1
1
  $:.unshift(File.dirname(__FILE__)) unless $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
2
2
 
3
- require "cucumber"
4
- require "cucumber/feature_file"
5
- require "cucumber/formatter/pretty"
6
3
  require "set"
7
4
 
5
+ require "gherkin"
6
+ require "gherkin/formatter/pretty_formatter"
7
+ require "stringio"
8
+
8
9
  require "cuketagger/version"
9
10
  require "cuketagger/tag_formatter"
10
11
  require "cuketagger/tagger"
metadata CHANGED
@@ -1,8 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cuketagger
3
3
  version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: "1.4"
4
+ hash: 5
5
+ prerelease: false
6
+ segments:
7
+ - 1
8
+ - 5
9
+ version: "1.5"
6
10
  platform: ruby
7
11
  authors:
8
12
  - Jari
@@ -11,7 +15,7 @@ autorequire:
11
15
  bindir: bin
12
16
  cert_chain: []
13
17
 
14
- date: 2011-02-01 00:00:00 +01:00
18
+ date: 2011-04-18 00:00:00 +02:00
15
19
  default_executable:
16
20
  dependencies:
17
21
  - !ruby/object:Gem::Dependency
@@ -22,6 +26,11 @@ dependencies:
22
26
  requirements:
23
27
  - - ">="
24
28
  - !ruby/object:Gem::Version
29
+ hash: 63
30
+ segments:
31
+ - 0
32
+ - 9
33
+ - 2
25
34
  version: 0.9.2
26
35
  type: :runtime
27
36
  version_requirements: *id001
@@ -42,7 +51,7 @@ files:
42
51
  - lib/cuketagger/version.rb
43
52
  - lib/cuketagger.rb
44
53
  - bin/cuketagger
45
- has_rdoc: true
54
+ has_rdoc: false
46
55
  homepage: http://cukes.info
47
56
  licenses: []
48
57
 
@@ -56,17 +65,23 @@ required_ruby_version: !ruby/object:Gem::Requirement
56
65
  requirements:
57
66
  - - ">="
58
67
  - !ruby/object:Gem::Version
68
+ hash: 3
69
+ segments:
70
+ - 0
59
71
  version: "0"
60
72
  required_rubygems_version: !ruby/object:Gem::Requirement
61
73
  none: false
62
74
  requirements:
63
75
  - - ">="
64
76
  - !ruby/object:Gem::Version
77
+ hash: 3
78
+ segments:
79
+ - 0
65
80
  version: "0"
66
81
  requirements: []
67
82
 
68
83
  rubyforge_project:
69
- rubygems_version: 1.5.0
84
+ rubygems_version: 1.3.7
70
85
  signing_key:
71
86
  specification_version: 3
72
87
  summary: batch tagging of cucumber features and scenarios