cuketagger 1.4 → 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.
@@ -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