cuketagger 0.8

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.
data/README.markdown ADDED
@@ -0,0 +1,8 @@
1
+
2
+ <pre><code>
3
+ $ sudo gem install jarib-cuketagger
4
+ $ cuketagger add:wip features/foo.feature:6 features/bar.feature
5
+ // check that the output is as expected
6
+ $ cuketagger --force add:wip features/foo.feature:6 features/bar.feature
7
+ // --force rewrites your files
8
+ </code></pre>
data/Rakefile ADDED
@@ -0,0 +1,47 @@
1
+ # encoding: utf-8
2
+
3
+ require "rake/clean"
4
+ require "rake/gempackagetask"
5
+ require "lib/cuketagger/version"
6
+ require "cucumber/rake/task"
7
+ CLEAN.include %w[pkg]
8
+
9
+ GEM_NAME = "cuketagger"
10
+ GEM_VERSION = CukeTagger::Version
11
+
12
+ spec = Gem::Specification.new do |s|
13
+ s.name = GEM_NAME
14
+ s.version = GEM_VERSION
15
+ s.has_rdoc = false
16
+ s.summary = "batch tagging of cucumber features and scenarios"
17
+ s.description = s.summary
18
+ s.authors = %w[Jari Bakken]
19
+ s.email = "jari.bakken@gmail.com"
20
+ s.homepage = "http://cukes.info"
21
+ s.files = %w[Rakefile README.markdown] + Dir['lib/**/*']
22
+ s.bindir = 'bin'
23
+ s.executables = Dir['bin/*'].map { |f| File.basename(f) }
24
+ s.add_runtime_dependency 'cucumber', '>= 0.3.103'
25
+ end
26
+
27
+ Rake::GemPackageTask.new(spec) do |pkg|
28
+ pkg.gem_spec = spec
29
+ end
30
+
31
+ namespace :gem do
32
+ desc "install the gem locally"
33
+ task :install => [:package] do
34
+ sh %{sudo #{Gem.ruby} -S gem install pkg/#{GEM_NAME}-#{GEM_VERSION}}
35
+ end
36
+
37
+ desc "Create a .gemspec file"
38
+ task :spec do
39
+ file = "#{GEM_NAME.downcase}.gemspec"
40
+ File.unlink file if ::File.exists?(file)
41
+ File.open(file, "w+") { |f| f << spec.to_ruby }
42
+ end
43
+ end
44
+
45
+ Cucumber::Rake::Task.new(:features) do |t|
46
+ t.cucumber_opts = "--format pretty"
47
+ end
data/bin/cuketagger ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require "#{File.dirname(__FILE__)}/../lib/cuketagger"
5
+ CukeTagger::Tagger.execute(ARGV)
@@ -0,0 +1,35 @@
1
+ module CukeTagger
2
+ module TagFormatter
3
+ attr_accessor :tagger
4
+
5
+ def before_feature(feature)
6
+ @__current_feature = feature
7
+ super
8
+ end
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
17
+ super
18
+ end
19
+
20
+ def before_tags(tags)
21
+ @tagger.process(@__current_feature, @__current_element, tags.instance_variable_get("@tag_names"))
22
+ end
23
+
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
+ end
35
+ end
@@ -0,0 +1,112 @@
1
+ module CukeTagger
2
+ class Tagger
3
+ USAGE = "#{File.basename $0} [-v|--version] [-f|--force] [add|remove|replace]:TAG[:REPLACEMENT] [FILE[:LINE]]+"
4
+
5
+ def self.execute(args)
6
+ new.execute(args)
7
+ end
8
+
9
+ def execute(args)
10
+ abort(USAGE) if args.empty? || args.first =~ /^(-h|--help)$/
11
+ opts = {:dry_run => true, :source => true}
12
+
13
+ CukeTagger.log :args, args
14
+
15
+ args.each do |arg|
16
+ case arg
17
+ when /^-v|--version$/
18
+ puts CukeTagger::Version
19
+ when /^(.+?\.feature)(:\d+)?$/
20
+ add_feature($1, $2.to_s)
21
+ when /^(add|remove):(.+?)$/
22
+ alterations << [$1.to_sym, $2]
23
+ when /^(replace):(.+?):(.+)$/
24
+ alterations << [$1.to_sym, [$2, $3]]
25
+ when /^(-f|--force)$/
26
+ opts[:autoformat] = "."
27
+ opts[:source] = false
28
+ Term::ANSIColor.coloring = false
29
+ else
30
+ abort(USAGE)
31
+ end
32
+ end
33
+
34
+ alterations.uniq!
35
+
36
+ CukeTagger.log :alterations, alterations
37
+
38
+ formatter = Cucumber::Formatter::Pretty.new(step_mother, $stdout, opts)
39
+ formatter.extend(TagFormatter)
40
+ formatter.tagger = self
41
+
42
+ walker = Cucumber::Ast::TreeWalker.new(step_mother, [formatter], opts)
43
+ walker.visit_features features
44
+ end
45
+
46
+ def process(feature, element, tag_names)
47
+ CukeTagger.log :process, :element => element.class
48
+ return unless should_alter?(feature, element)
49
+
50
+ alterations.each do |op, tag_name|
51
+ case op
52
+ when :add
53
+ tag_names.push "@#{tag_name}"
54
+ when :remove
55
+ tag_names.delete "@#{tag_name}"
56
+ when :replace
57
+ idx = tag_names.index "@#{tag_name.first}"
58
+ if idx.nil?
59
+ $stderr.puts "expected #{tag_name.first.inspect} at #{file_and_line_for(feature, element).join(":")}, skipping"
60
+ else
61
+ tag_names[idx] = "@#{tag_name.last}"
62
+ end
63
+ end
64
+ end
65
+ end
66
+
67
+ def should_alter?(feature, element)
68
+ fl = file_and_line_for(feature, element)
69
+
70
+ CukeTagger.log(:file_and_line => fl, :features_to_change => features_to_change)
71
+
72
+ features_to_change.include? fl
73
+ end
74
+
75
+ private
76
+
77
+ def file_and_line_for(feature, element)
78
+ line = if element.respond_to?(:line)
79
+ element.line
80
+ elsif element.kind_of?(Cucumber::Ast::ScenarioOutline)
81
+ element.instance_variable_get("@line")
82
+ else
83
+ 0
84
+ end
85
+
86
+ [feature.file, line]
87
+ end
88
+
89
+ def add_feature(path, line)
90
+ ff = Cucumber::FeatureFile.new(path).parse(step_mother, {})
91
+ features_to_change << [path, line[1,line.length].to_i]
92
+ features.add_feature ff
93
+ end
94
+
95
+ def step_mother
96
+ @step_mother ||= Cucumber::StepMother.new
97
+ end
98
+
99
+ def features
100
+ @features ||= Cucumber::Ast::Features.new
101
+ end
102
+
103
+ def alterations
104
+ @alterations ||= []
105
+ end
106
+
107
+ def features_to_change
108
+ @features_to_change ||= Set.new
109
+ end
110
+
111
+ end
112
+ end
@@ -0,0 +1,3 @@
1
+ module CukeTagger
2
+ Version = "0.8"
3
+ end
data/lib/cuketagger.rb ADDED
@@ -0,0 +1,16 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
2
+
3
+ require "cucumber"
4
+ require "cucumber/feature_file"
5
+ require "cucumber/formatter/pretty"
6
+ require "set"
7
+
8
+ require "cuketagger/version"
9
+ require "cuketagger/tag_formatter"
10
+ require "cuketagger/tagger"
11
+
12
+ module CukeTagger
13
+ def self.log(*args)
14
+ File.open("/tmp/cuketagger.log", "a") { |file| file.puts args.inspect } if $DEBUG
15
+ end
16
+ end
metadata ADDED
@@ -0,0 +1,70 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cuketagger
3
+ version: !ruby/object:Gem::Version
4
+ version: "0.8"
5
+ platform: ruby
6
+ authors:
7
+ - Jari
8
+ - Bakken
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2009-10-07 00:00:00 +02:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: cucumber
18
+ type: :runtime
19
+ version_requirement:
20
+ version_requirements: !ruby/object:Gem::Requirement
21
+ requirements:
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: 0.3.103
25
+ version:
26
+ description: batch tagging of cucumber features and scenarios
27
+ email: jari.bakken@gmail.com
28
+ executables:
29
+ - cuketagger
30
+ extensions: []
31
+
32
+ extra_rdoc_files: []
33
+
34
+ files:
35
+ - Rakefile
36
+ - README.markdown
37
+ - lib/cuketagger/tag_formatter.rb
38
+ - lib/cuketagger/tagger.rb
39
+ - lib/cuketagger/version.rb
40
+ - lib/cuketagger.rb
41
+ has_rdoc: true
42
+ homepage: http://cukes.info
43
+ licenses: []
44
+
45
+ post_install_message:
46
+ rdoc_options: []
47
+
48
+ require_paths:
49
+ - lib
50
+ required_ruby_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: "0"
55
+ version:
56
+ required_rubygems_version: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: "0"
61
+ version:
62
+ requirements: []
63
+
64
+ rubyforge_project:
65
+ rubygems_version: 1.3.5
66
+ signing_key:
67
+ specification_version: 3
68
+ summary: batch tagging of cucumber features and scenarios
69
+ test_files: []
70
+