cuporter 0.3.7 → 0.3.9

Sign up to get free protection for your applications and to get access to all the features.
data/README.textile CHANGED
@@ -114,56 +114,71 @@ h4. help
114
114
  <pre>
115
115
  $ cuporter -h
116
116
 
117
- Usage: cuporter [options]
118
-
119
- -r, --report [tag|feature|tree] View, or type of report.
120
- Default: "tag"
121
-
122
- -f, --format [xml|html|csv|text] Output format.
123
- Default: text (it's pretty, though!)
124
-
125
- -i, --input-dir DIR Root directory of *.feature files.
126
- Default: "features"
127
-
128
- Used to build the glob pattern '[--input-dir]/**/*.feature', which is really most likely
129
- "features/**/*.features" and finds all feature files anywhere under "features" or
130
- your custom root supplied with this option.
131
- Overridden by "--file-input'.
132
-
133
- -I, --file-input FILE Single *.feature file. Full name with extension, like 'path/to/file.feature.'
134
- Overrides "--input-dir" and used mostly for testing.
135
-
136
- -o, --output-file FILE Output file path, like 'tmp/cucumber/tag_report.html'.
137
-
138
- -t, --tags TAG_EXPRESSION Filter on tags for name report.
139
- TAG_EXPRESSION rules:
140
- 1. $ cucumber --help
141
- 2. http://github.com/aslakhellesoy/cucumber/wiki/Tags
142
-
143
- -T, --title STRING Override report default title, which is different for each view/report.
144
- This affects the xml 'report' node title and the html head > title attributes.
117
+ Usage: cuporter [options]
118
+
119
+ -r, --report [tag|feature|tree] View, or type of report.
120
+ Default: "tag"
121
+
122
+ -f, --format [xml|html|csv|text] Output format.
123
+ Default: text (it's pretty, though!)
124
+
125
+ -i, --input-dir DIR Root directory of *.feature files.
126
+ Default: "features"
127
+
128
+ Used to build the glob pattern '[--input-dir]/**/*.feature', which is really most likely
129
+ "features/**/*.features" and finds all feature files anywhere under "features" or
130
+ your custom root supplied with this option.
131
+ Overridden by "--file-input'.
132
+
133
+ -I, --file-input FILE Single *.feature file. Full name with extension, like 'path/to/file.feature.'
134
+ Overrides "--input-dir" and used mostly for testing.
135
+
136
+ -o, --output-file FILE Output file path, like 'tmp/cucumber/tag_report.html'.
137
+
138
+ -t, --tags TAG_EXPRESSION Filter on tags for name report.
139
+ TAG_EXPRESSION rules:
140
+ 1. $ cucumber --help
141
+ 2. http://github.com/aslakhellesoy/cucumber/wiki/Tags
142
+
143
+ -T, --title STRING Override report default title, which is different for each view/report.
144
+ This affects the xml 'report' node title and the html head > title attributes.
145
+
145
146
  CSS and Javascript asset options:
146
147
 
147
- -a, --assets-dir PATH Path to folder for CSS and Javascript assets.
148
- Only applies with '--link-assets', which is off by default.
149
- Setting this will cause assets to be copied from 'public';
150
- otherwise, the html will link to the files under 'cuporter/public' in
151
- your gempath.
152
-
153
- -l, --link-assets Do not inline CSS and js in <style/> and <script/> tags, but link to
154
- external files instead.
148
+ -l, --link-assets Do not inline CSS and js in <style/> and <script/> tags, but link to external files instead.
155
149
  Default: 'false' for the tag and feature views, not optional for the
156
150
  tree view, which requires external gifs.
157
-
158
- Reporting options: on by default but can be turned off:
159
-
160
- --no-sort Do not sort tags, features, scenarios, or outlines
161
- --no-number Do not get or show scenario or example numbers, (i.e., do not number the leaf nodes).
162
- --no-total Do not get or show totals
163
- --no-show-tags Do not show cucumber tags at the feature, scenario, or outline level.
164
- --no-show-files Do not show feature file paths.
165
- --no-leaves Show features only, with no scenarios or outlines.
166
-
151
+
152
+ -c, --copy-public-assets If --output-file is supplied, and you're linking to external
153
+ CSS and JavaScript assets, copy them from 'public/' to 'cuporter_public'
154
+ in the same dir as the output file.
155
+ Sets --use-copied-public-assets to 'true', and
156
+ the html report will link to these files by relative path.
157
+
158
+ Default: 'false'
159
+
160
+ -u, --use-copied-public-assets When running batches of reports, and the assets folder has already been
161
+ created by another call to cuporter with '--copy-public-assets'.
162
+ Set to 'true' automatically along with --copy-public-assets.
163
+
164
+ Default: 'false'
165
+
166
+ --config-file PATH Specify any of these options in a yml file.
167
+ Order of precedence:
168
+ 1 - command line
169
+ 2 - yaml file
170
+ 3 - these defaults
171
+
172
+ Default: 'cuporter.yml'
173
+
174
+ Reporting options: on by default but can be turned off:
175
+
176
+ --no-sort Do not sort tags, features, scenarios, or outlines
177
+ --no-number Do not get or show scenario or example numbers, (i.e., do not number the leaf nodes).
178
+ --no-total Do not get or show totals
179
+ --no-show-tags Do not show cucumber tags at the feature, scenario, or outline level.
180
+ --no-show-files Do not show feature file paths.
181
+ --no-leaves Show features only, with no scenarios or outlines.
167
182
 
168
183
  </pre>
169
184
 
@@ -191,7 +206,7 @@ h4. Examples
191
206
 
192
207
  h3. Dependencies
193
208
 
194
- # Nokogiri 1.4.4 or above
209
+ # Nokogiri 1.4.1 or above
195
210
  ** For all things Nodular: XML document building and XSL transformation into HTML
196
211
  ** Not tested on earlier versions yet but I'd guess you'll be fine with anything recent.
197
212
  ** @libxml2@ and @libxslt@ are required by this gem, which *should* handle them smoothly. However, @libxml@ and cousins
@@ -206,6 +221,3 @@ h3. Acknowledgements
206
221
 
207
222
  * Acknowledgements remain due to the Cucumber HTML formatter, and to the human one, too!.
208
223
  * Thanks to everyone involved in Nokogiri, jQuery and the Treeview plugin.
209
-
210
- I used to _"Consider this a stop-gap until we get this functionality in a proper cucumber formatter"_, but now I'm not so sure. Megalomania?
211
-
data/Rakefile CHANGED
@@ -65,7 +65,7 @@ namespace :cuporter do
65
65
 
66
66
  spec = Gem::Specification.new do |s|
67
67
  s.name = 'cuporter'
68
- s.version = '0.3.7'
68
+ s.version = '0.3.9'
69
69
  s.rubyforge_project = s.name
70
70
 
71
71
  s.platform = Gem::Platform::RUBY
@@ -83,7 +83,7 @@ namespace :cuporter do
83
83
  s.executables = [s.default_executable]
84
84
 
85
85
  s.files = %w(LICENSE README.textile Rakefile) +
86
- FileList["lib/**/*.{rb,xslt}", "bin/*", "public/**/*.{css,js,gif}"].to_a
86
+ FileList["config/**/*", "lib/**/*.{rb,xslt}", "bin/*", "public/**/*.{css,js,gif}"].to_a
87
87
 
88
88
  s.require_path = "lib"
89
89
  end
data/bin/cuporter CHANGED
@@ -1,6 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ $LOAD_PATH.unshift File.expand_path('../config', File.dirname(__FILE__))
3
4
  $LOAD_PATH.unshift File.expand_path('../lib', File.dirname(__FILE__))
5
+ require 'configuration'
4
6
  require 'cuporter'
5
7
 
6
8
 
@@ -14,8 +16,12 @@ when 'csv'
14
16
  when 'text', 'pretty'
15
17
  report.doc.to_text
16
18
  when 'html'
17
- Cuporter.options[:link_assets] = true if Cuporter.options[:report] == "tree"
18
- html = Cuporter::Document.new_html(Cuporter.options[:report], Cuporter.options[:link_assets], Cuporter.options[:assets_dir])
19
+ if Cuporter.options[:copy_public_assets]
20
+ Cuporter::Document::Assets.copy(Cuporter.options[:output_file])
21
+ end
22
+ html = Cuporter::Document.new_html(Cuporter.options[:report],
23
+ Cuporter.options[:link_assets],
24
+ Cuporter.options[:use_copied_public_assets])
19
25
  formatters = File.expand_path("../lib/cuporter/formatters", File.dirname(__FILE__))
20
26
  xslt = Nokogiri::XSLT(File.read("#{formatters}/xml_to_html.xslt"))
21
27
  html.add_report(xslt.transform(report.doc).at('.report'))
@@ -0,0 +1,39 @@
1
+ # Copyright 2011 ThoughtWorks, Inc. Licensed under the MIT License
2
+
3
+ module Cuporter
4
+ module Config
5
+ module CLI
6
+ class FilterArgsBuilder
7
+ def initialize(cli_tags = [])
8
+ @cli_tags = cli_tags
9
+ @all = []
10
+ @any = []
11
+ @none = []
12
+ @args = {}
13
+ filter_args
14
+ end
15
+
16
+ def filter_args
17
+ @cli_tags.each do |expression|
18
+ case expression
19
+ when /^~@/
20
+ @none << expression.sub(/~/,'')
21
+ when /,/
22
+ @any |= expression.split(',')
23
+ else
24
+ @all << expression
25
+ end
26
+ end
27
+ end
28
+
29
+ def args
30
+ @args[:any] = @any unless @any.empty?
31
+ @args[:all] = @all unless @all.empty?
32
+ @args[:none] = @none unless @none.empty?
33
+ @args
34
+ end
35
+
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,153 @@
1
+ # Copyright 2010 ThoughtWorks, Inc. Licensed under the MIT License
2
+ require 'optparse'
3
+ require 'fileutils'
4
+
5
+ module Cuporter
6
+ module Config
7
+ module CLI
8
+
9
+ class Options
10
+
11
+ def self.[](key)
12
+ self.options[key]
13
+ end
14
+
15
+ def self.options
16
+ parse unless @options
17
+ @options
18
+ end
19
+
20
+ def self.args
21
+ @@args
22
+ end
23
+
24
+ def self.parse
25
+ @@args = ARGV.dup
26
+ @options = {}
27
+
28
+ OptionParser.new(ARGV.dup) do |opts|
29
+ opts.banner = "Usage: cuporter [options]\n\n"
30
+
31
+ opts.on("-r", "--report [tag|feature|tree]", %Q{View, or type of report.
32
+ Default: "tag"
33
+ }) do |r|
34
+ @options[:report] = (r == 'name' ? 'feature' : r)
35
+ end
36
+
37
+ opts.on("-f", "--format [xml|html|csv|text]", %Q{Output format.
38
+ Default: text (it's pretty, though!)
39
+ }) do |f|
40
+ @options[:format] = f
41
+ end
42
+
43
+ opts.on("-i", "--input-dir DIR", %Q{Root directory of *.feature files.
44
+ Default: "features"
45
+
46
+ Used to build the glob pattern '[--input-dir]/**/*.feature', which is really most likely
47
+ "features/**/*.features" and finds all feature files anywhere under "features" or
48
+ your custom root supplied with this option.
49
+ Overridden by "--file-input'.
50
+ }) do |i|
51
+ @options[:input_dir] = i.sub(/#{File::SEPARATOR}$/,'')
52
+ end
53
+
54
+ opts.on("-I", "--file-input FILE", %Q{Single *.feature file. Full name with extension, like 'path/to/file.feature.'
55
+ Overrides "--input-dir" and used mostly for testing.
56
+ }) do |file|
57
+ @options[:input_file] = file
58
+ end
59
+
60
+ opts.on("-o", "--output-file FILE", %Q{Output file path, like 'tmp/cucumber/tag_report.html'.
61
+ }) do |o|
62
+ @options[:output_file] = o
63
+ end
64
+
65
+ @options[:tags] = []
66
+ opts.on("-t", "--tags TAG_EXPRESSION", %Q{Filter on tags for name report.
67
+ TAG_EXPRESSION rules:
68
+ 1. $ cucumber --help
69
+ 2. http://github.com/aslakhellesoy/cucumber/wiki/Tags
70
+ }) do |t|
71
+ @options[:tags] << t
72
+ end
73
+
74
+ opts.on("-T", "--title STRING", %Q{Override report default title, which is different for each view/report.
75
+ This affects the xml 'report' node title and the html head > title attributes.
76
+ }) do |title|
77
+ @options[:title] = title
78
+ end
79
+
80
+ opts.separator "CSS and Javascript asset options:\n\n"
81
+
82
+ opts.on("-l", "--link-assets", %Q{Do not inline CSS and js in <style/> and <script/> tags, but link to external files instead.
83
+ Default: 'false' for the tag and feature views, not optional for the
84
+ tree view, which requires external gifs.
85
+ }) do |l|
86
+ @options[:link_assets] = l
87
+ end
88
+
89
+ opts.on("-c", "--copy-public-assets", %Q{If --output-file is supplied, and you're linking to external
90
+ CSS and JavaScript assets, copy them from 'public/' to 'cuporter_public'
91
+ in the same dir as the output file.
92
+ Sets --use-copied-public-assets to 'true', and
93
+ the html report will link to these files by relative path.
94
+
95
+ Default: 'false'
96
+ }) do |c|
97
+ @options[:copy_public_assets] = c
98
+ @options[:use_copied_public_assets] = c
99
+ end
100
+
101
+ opts.on("-u", "--use-copied-public-assets", %Q{When running batches of reports, and the assets folder has already been
102
+ created by another call to cuporter with '--copy-public-assets'.
103
+ Set to 'true' automatically along with --copy-public-assets.
104
+
105
+ Default: 'false'
106
+ }) do |u|
107
+ @options[:use_copied_public_assets] = u
108
+ end
109
+
110
+ opts.on("--config-file PATH", %Q{Specify any of these options in a yml file.
111
+ Order of precedence:
112
+ 1 - command line
113
+ 2 - yaml file
114
+ 3 - these defaults
115
+
116
+ Default: 'cuporter.yml'
117
+ }) do |path|
118
+ @options[:config_file] = path
119
+ end
120
+
121
+ opts.separator "Reporting options: on by default but can be turned off:\n\n"
122
+ opts.on("--no-sort", "Do not sort tags, features, scenarios, or outlines\n") do |n|
123
+ @options[:sort] = n
124
+ end
125
+
126
+ opts.on("--no-number", "Do not get or show scenario or example numbers, (i.e., do not number the leaf nodes).\n") do |n|
127
+ @options[:number] = n
128
+ end
129
+
130
+ opts.on("--no-total", "Do not get or show totals\n") do |n|
131
+ @options[:total] = n
132
+ end
133
+
134
+ opts.on("--no-show-tags", "Do not show cucumber tags at the feature, scenario, or outline level.\n") do |show_tags|
135
+ @options[:show_tags] = show_tags
136
+ end
137
+
138
+ opts.on("--no-show-files", "Do not show feature file paths.\n") do |show_files|
139
+ @options[:show_files] = show_files
140
+ end
141
+
142
+ opts.on("--no-leaves", "Show features only, with no scenarios or outlines.\n\n\n") do |l|
143
+ @options[:leaves] = l
144
+ end
145
+
146
+ end.parse!
147
+
148
+ end
149
+ end
150
+ end
151
+ end
152
+
153
+ end
@@ -0,0 +1,94 @@
1
+ # Copyright 2011 ThoughtWorks, Inc. Licensed under the MIT License
2
+ $LOAD_PATH.unshift( File.expand_path("#{File.dirname(__FILE__)}"))
3
+ require 'fileutils'
4
+ require 'cli/options'
5
+ require 'cli/filter_args_builder'
6
+
7
+ module Cuporter
8
+ module Config
9
+
10
+ module Options
11
+
12
+ DEFAULTS = { :report => "tag",
13
+ :format => "text",
14
+ :input_dir => "features",
15
+ :tags => [],
16
+ :copy_public_assets => false,
17
+ :use_copied_public_assets => false,
18
+ :sort => true,
19
+ :number => true,
20
+ :total => true,
21
+ :show_tags => true,
22
+ :show_files => true,
23
+ :leaves => true
24
+ }
25
+
26
+ def self.options
27
+ unless @options
28
+ # empty hash if no file
29
+ file_config = config_file(Cuporter::Config::CLI::Options[:config_file] || "cuporter.yml")
30
+
31
+ # CLI options replace any found in the file
32
+ cli_options_over_file_options = file_config.merge(Cuporter::Config::CLI::Options.options)
33
+
34
+ # defaults will be used for anything not so far specified in the file
35
+ # or CLI
36
+ @options = post_process(DEFAULTS.merge(cli_options_over_file_options))
37
+ end
38
+ @options
39
+ end
40
+
41
+ def self.post_process(options)
42
+ options[:input_file_pattern] = options.delete(:input_file) || "#{options.delete(:input_dir)}/**/*.feature"
43
+ options[:root_dir] = options[:input_file_pattern].split(File::SEPARATOR).first
44
+ options[:filter_args] = Cuporter::Config::CLI::FilterArgsBuilder.new(options.delete(:tags)).args
45
+ if options[:output_file]
46
+ options[:output_file] = full_path(options[:output_file].dup)
47
+ else
48
+ options[:copy_public_assets] = false
49
+ options[:use_copied_public_assets] = false
50
+ end
51
+ options
52
+ end
53
+
54
+ def self.config_file(path)
55
+ return {} unless File.exists?(path)
56
+
57
+ require 'yaml'
58
+ pairs = {}
59
+ YAML.load_file(path).each do |key, value|
60
+ pairs[key.to_sym] = case value
61
+ when /^true$/i
62
+ true
63
+ when /^false$/i
64
+ false
65
+ end || value
66
+ end
67
+ pairs
68
+ end
69
+
70
+ def self.full_path(path)
71
+ expanded_path = File.expand_path(path)
72
+ path_nodes = expanded_path.split(File::SEPARATOR)
73
+ file = path_nodes.pop
74
+ FileUtils.makedirs(path_nodes.join(File::SEPARATOR))
75
+ expanded_path
76
+ end
77
+
78
+ end
79
+ end
80
+
81
+ def self.html?
82
+ Config::Options[:format] == 'html'
83
+ end
84
+
85
+ def self.options
86
+ Config::Options.options
87
+ end
88
+
89
+ def self.output_file
90
+ if options[:output_file]
91
+ File.open(options[:output_file], "w")
92
+ end
93
+ end
94
+ end
data/lib/cuporter.rb CHANGED
@@ -2,8 +2,6 @@
2
2
  $LOAD_PATH.unshift( File.expand_path("#{File.dirname(__FILE__)}"))
3
3
  $LOAD_PATH.unshift( File.expand_path("#{File.dirname(__FILE__)}/.."))
4
4
  require 'cuporter/extensions/string'
5
- require 'cuporter/cli/options'
6
- require 'cuporter/cli/filter_args_builder'
7
5
  require 'cuporter/node'
8
6
  require 'cuporter/formatters/text'
9
7
  require 'cuporter/formatters/csv'
@@ -12,6 +10,7 @@ require 'cuporter/feature_parser'
12
10
  require 'cuporter/tag_nodes_parser'
13
11
  require 'cuporter/node_parser'
14
12
  require 'cuporter/document'
13
+ require 'cuporter/document/assets'
15
14
  require 'cuporter/document/html_document'
16
15
  require 'cuporter/report/report_base'
17
16
  require 'cuporter/report/tag_report'
@@ -10,20 +10,14 @@ module Cuporter
10
10
  doc
11
11
  end
12
12
 
13
- def self.new_html(view, link_assets, assets_dir)
13
+ def self.new_html(view, link_assets, use_copied_public_assets)
14
14
  Nokogiri::XML::Document.send(:include, Cuporter::Document::Html)
15
15
  doc = Nokogiri::XML::Document.new
16
16
  doc.view = view
17
17
  doc.link_assets = link_assets
18
- project_assets = File.expand_path( "public", File.dirname(__FILE__) + "../../../")
18
+ doc.assets_src = Assets::PUBLIC_SOURCE_PATH
19
+ doc.assets_base_path = Assets.base_path(use_copied_public_assets)
19
20
 
20
- # we count on the dirs being created by the option parser
21
- if link_assets
22
- FileUtils.cp_r("#{project_assets}/.", assets_dir)
23
- doc.assets_dir = assets_dir
24
- else
25
- doc.assets_dir = project_assets
26
- end
27
21
  root = Nokogiri::XML::Node.new('html', doc)
28
22
  root.create_internal_subset( 'html', "-//W3C//DTD XHTML 1.0 Strict//EN", "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd")
29
23
  doc << root
@@ -0,0 +1,25 @@
1
+ # Copyright 2011 ThoughtWorks, Inc. Licensed under the MIT License
2
+ module Cuporter
3
+ module Document
4
+ module Assets
5
+ PUBLIC_SOURCE_PATH = File.expand_path( "public", File.dirname(__FILE__) + "../../../../")
6
+ RELATIVE_PUBLIC_ASSETS_PATH = "cuporter_public"
7
+
8
+ def self.copy(output_file_path)
9
+ assets_target = "#{File.dirname(output_file_path)}/#{RELATIVE_PUBLIC_ASSETS_PATH}"
10
+ FileUtils.rm_rf(assets_target) if File.exists?(assets_target)
11
+ FileUtils.mkdir(assets_target)
12
+ FileUtils.cp_r("#{PUBLIC_SOURCE_PATH}/.", assets_target)
13
+ end
14
+
15
+ def self.base_path(use_copied_public_assets)
16
+ # we count on the dirs being created by the option parser
17
+ if use_copied_public_assets
18
+ RELATIVE_PUBLIC_ASSETS_PATH
19
+ else
20
+ PUBLIC_SOURCE_PATH
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -2,7 +2,11 @@
2
2
  module Cuporter
3
3
  module Document
4
4
  module Html
5
- attr_accessor :view, :link_assets, :assets_dir
5
+ attr_accessor :view, :link_assets, :assets_src, :assets_base_path
6
+
7
+ def assets_base_path
8
+ @assets_base_path ||= assets_target || assets_src
9
+ end
6
10
 
7
11
  def add_report(node)
8
12
  root << head(node['title'])
@@ -50,22 +54,22 @@ module Cuporter
50
54
 
51
55
  def style_css(file)
52
56
  style = new_node('style', 'type' => 'text/css')
53
- style << file_contents("#{assets_dir}/#{file}")
57
+ style << file_contents("#{assets_src}/#{file}")
54
58
  style
55
59
  end
56
60
 
57
61
  def script_js(file)
58
62
  script = new_node('script', 'type' => 'text/javascript')
59
- script << file_contents("#{assets_dir}/#{file}")
63
+ script << file_contents("#{assets_src}/#{file}")
60
64
  script
61
65
  end
62
66
 
63
67
  def link_css(file)
64
- new_node('link', 'type' => 'text/css', 'rel' => 'stylesheet', 'href' => "#{assets_dir}/#{file}")
68
+ new_node('link', 'type' => 'text/css', 'rel' => 'stylesheet', 'href' => "#{assets_base_path}/#{file}")
65
69
  end
66
70
 
67
71
  def link_js(file)
68
- new_node('script', 'type' => 'text/javascript', 'src' => "#{assets_dir}/#{file}")
72
+ new_node('script', 'type' => 'text/javascript', 'src' => "#{assets_base_path}/#{file}")
69
73
  end
70
74
 
71
75
  def file_contents(file_name)
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cuporter
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 1
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 3
9
- - 7
10
- version: 0.3.7
9
+ - 9
10
+ version: 0.3.9
11
11
  platform: ruby
12
12
  authors:
13
13
  - Tim Camper
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-05-31 00:00:00 -04:00
18
+ date: 2011-06-14 00:00:00 -04:00
19
19
  default_executable: cuporter
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -47,8 +47,10 @@ files:
47
47
  - LICENSE
48
48
  - README.textile
49
49
  - Rakefile
50
- - lib/cuporter/cli/filter_args_builder.rb
51
- - lib/cuporter/cli/options.rb
50
+ - config/cli/filter_args_builder.rb
51
+ - config/cli/options.rb
52
+ - config/configuration.rb
53
+ - lib/cuporter/document/assets.rb
52
54
  - lib/cuporter/document/html_document.rb
53
55
  - lib/cuporter/document.rb
54
56
  - lib/cuporter/extensions/nokogiri.rb
@@ -1,37 +0,0 @@
1
- # Copyright 2010 ThoughtWorks, Inc. Licensed under the MIT License
2
-
3
- module Cuporter
4
- module CLI
5
- class FilterArgsBuilder
6
- def initialize(cli_tags = [])
7
- @cli_tags = cli_tags
8
- @all = []
9
- @any = []
10
- @none = []
11
- @args = {}
12
- filter_args
13
- end
14
-
15
- def filter_args
16
- @cli_tags.each do |expression|
17
- case expression
18
- when /^~@/
19
- @none << expression.sub(/~/,'')
20
- when /,/
21
- @any |= expression.split(',')
22
- else
23
- @all << expression
24
- end
25
- end
26
- end
27
-
28
- def args
29
- @args[:any] = @any unless @any.empty?
30
- @args[:all] = @all unless @all.empty?
31
- @args[:none] = @none unless @none.empty?
32
- @args
33
- end
34
-
35
- end
36
- end
37
- end
@@ -1,162 +0,0 @@
1
- # Copyright 2010 ThoughtWorks, Inc. Licensed under the MIT License
2
- require 'optparse'
3
- require 'fileutils'
4
-
5
- module Cuporter
6
- module CLI
7
-
8
- class Options
9
-
10
- def self.[](key)
11
- self.options[key]
12
- end
13
-
14
- def self.options
15
- unless @options
16
- self.parse
17
- @options[:input_file_pattern] = @options.delete(:input_file) || "#{@options.delete(:input_dir)}/**/*.feature"
18
- @options[:root_dir] = @options[:input_file_pattern].split(File::SEPARATOR).first
19
- @options[:filter_args] = Cuporter::CLI::FilterArgsBuilder.new(@options.delete(:tags)).args
20
- end
21
- @options
22
- end
23
-
24
- def self.args
25
- @@args
26
- end
27
-
28
-
29
- def self.full_path(path)
30
- expanded_path = File.expand_path(path)
31
- path_nodes = expanded_path.split(File::SEPARATOR)
32
- file = path_nodes.pop
33
- FileUtils.makedirs(path_nodes.join(File::SEPARATOR))
34
- expanded_path
35
- end
36
-
37
- def self.parse
38
- @@args = ARGV.dup
39
- @options = {}
40
- OptionParser.new(ARGV.dup) do |opts|
41
- opts.banner = "Usage: cuporter [options]\n\n"
42
-
43
- @options[:report] = "tag"
44
- opts.on("-r", "--report [tag|feature|tree]", %Q{View, or type of report.
45
- Default: "tag"
46
- }) do |r|
47
- @options[:report] = (r == 'name' ? 'feature' : r)
48
- end
49
-
50
- @options[:format] = "text"
51
- opts.on("-f", "--format [xml|html|csv|text]", %Q{Output format.
52
- Default: text (it's pretty, though!)
53
- }) do |f|
54
- @options[:format] = f
55
- end
56
-
57
- @options[:input_dir] = "features"
58
- opts.on("-i", "--input-dir DIR", %Q{Root directory of *.feature files.
59
- Default: "features"
60
-
61
- Used to build the glob pattern '[--input-dir]/**/*.feature', which is really most likely
62
- "features/**/*.features" and finds all feature files anywhere under "features" or
63
- your custom root supplied with this option.
64
- Overridden by "--file-input'.
65
- }) do |i|
66
- @options[:input_dir] = i.sub(/#{File::SEPARATOR}$/,'')
67
- end
68
-
69
- opts.on("-I", "--file-input FILE", %Q{Single *.feature file. Full name with extension, like 'path/to/file.feature.'
70
- Overrides "--input-dir" and used mostly for testing.
71
- }) do |file|
72
- @options[:input_file] = file
73
- end
74
-
75
- opts.on("-o", "--output-file FILE", %Q{Output file path, like 'tmp/cucumber/tag_report.html'.
76
- }) do |o|
77
- @options[:output_file] = full_path(o)
78
- end
79
-
80
- @options[:tags] = []
81
- opts.on("-t", "--tags TAG_EXPRESSION", %Q{Filter on tags for name report.
82
- TAG_EXPRESSION rules:
83
- 1. $ cucumber --help
84
- 2. http://github.com/aslakhellesoy/cucumber/wiki/Tags
85
- }) do |t|
86
- @options[:tags] << t
87
- end
88
-
89
- opts.on("-T", "--title STRING", %Q{Override report default title, which is different for each view/report.
90
- This affects the xml 'report' node title and the html head > title attributes.
91
- }) do |title|
92
- @options[:title] = title
93
- end
94
-
95
- opts.separator "CSS and Javascript asset options:\n\n"
96
- opts.on("-a", "--assets-dir PATH", %Q{Path to folder for CSS and Javascript assets.
97
- Only applies with '--link-assets', which is off by default.
98
- Setting this will cause assets to be copied from 'public';
99
- otherwise, the html will link to the files under 'cuporter/public' in
100
- your gempath.
101
- }) do |a|
102
- @options[:assets_dir] = a
103
- end
104
-
105
- opts.on("-l", "--link-assets", %Q{Do not inline CSS and js in <style/> and <script/> tags, but link to external files instead.
106
- Default: 'false' for the tag and feature views, not optional for the
107
- tree view, which requires external gifs.
108
- }) do |l|
109
- @options[:link_assets] = l
110
- end
111
-
112
- opts.separator "Reporting options: on by default but can be turned off:\n\n"
113
- @options[:sort] = true
114
- opts.on("--no-sort", "Do not sort tags, features, scenarios, or outlines\n") do |n|
115
- @options[:sort] = n
116
- end
117
-
118
- @options[:number] = true
119
- opts.on("--no-number", "Do not get or show scenario or example numbers, (i.e., do not number the leaf nodes).\n") do |n|
120
- @options[:number] = n
121
- end
122
-
123
- @options[:total] = true
124
- opts.on("--no-total", "Do not get or show totals\n") do |n|
125
- @options[:total] = n
126
- end
127
-
128
- @options[:show_tags] = true
129
- opts.on("--no-show-tags", "Do not show cucumber tags at the feature, scenario, or outline level.\n") do |show_tags|
130
- @options[:show_tags] = show_tags
131
- end
132
-
133
- @options[:show_files] = true
134
- opts.on("--no-show-files", "Do not show feature file paths.\n") do |show_files|
135
- @options[:show_files] = show_files
136
- end
137
-
138
- @options[:leaves] = true
139
- opts.on("--no-leaves", "Show features only, with no scenarios or outlines.\n\n\n") do |l|
140
- @options[:leaves] = l
141
- end
142
-
143
- end.parse!
144
-
145
- end
146
- end
147
- end
148
-
149
- def self.html?
150
- CLI::Options[:format] == 'html'
151
- end
152
-
153
- def self.options
154
- CLI::Options.options
155
- end
156
-
157
- def self.output_file
158
- if options[:output_file]
159
- File.open(options[:output_file], "w")
160
- end
161
- end
162
- end