cuporter 0.3.9 → 0.3.10

Sign up to get free protection for your applications and to get access to all the features.
@@ -25,9 +25,25 @@ h3. 4 Output Formats
25
25
  # pretty-print text
26
26
  # csv
27
27
 
28
+ Splitting the output among multiple formats is supported, so you could run a single report and write it
29
+ to an html file, a csv file, and show the xml or text on @stdout@ in the terminal.
30
+
28
31
  h3. A bunch of configuration options
29
32
 
30
- See the help output below.
33
+ See the help output below for all of the options, which can be supplied in to ways:
34
+
35
+ # Command Line
36
+ # Yaml File
37
+ ** use it to add to or override the program defaults
38
+ ** *Batch mode:* run multiple reports at once simply by specifying an option set for each in @cuporter.yml@
39
+ ** the file name itself is a configurable option
40
+ ** See the samples.
41
+
42
+ h4. option override precedence
43
+
44
+ # Highest Precedence (overrides all): command line
45
+ # Middle Precedence: yaml file
46
+ # Lowest Precedence: @Cuporter::Config::OptionSet::DEFAULTS@
31
47
 
32
48
  ---------
33
49
 
@@ -113,73 +129,77 @@ h4. help
113
129
 
114
130
  <pre>
115
131
  $ cuporter -h
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.
145
-
146
- CSS and Javascript asset options:
147
-
148
- -l, --link-assets Do not inline CSS and js in <style/> and <script/> tags, but link to external files instead.
149
- Default: 'false' for the tag and feature views, not optional for the
150
- tree view, which requires external gifs.
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.
182
-
132
+
133
+ Usage: cuporter [options]
134
+
135
+ -r, --report [tag|feature|tree] View, or type of report.
136
+ Default: "tag"
137
+
138
+ -f, --format [xml|html|csv|text] Output format.
139
+ Default: text (it's pretty, though!)
140
+
141
+ -i, --input-dir DIR Root directory of *.feature files.
142
+ Default: "features"
143
+
144
+ Used to build the glob pattern '[--input-dir]/**/*.feature', which is really most likely
145
+ "features/**/*.features" and finds all feature files anywhere under "features" or
146
+ your custom root supplied with this option.
147
+ Overridden by "--file-input'.
148
+
149
+ -I, --file-input FILE Single *.feature file. Full name with extension, like 'path/to/file.feature.'
150
+ Overrides "--input-dir" and used mostly for testing.
151
+
152
+ -o, --output-file FILE Output file path, like 'tmp/cucumber/tag_report.html'.
153
+
154
+ -t, --tags TAG_EXPRESSION Filter on tags for name report.
155
+ TAG_EXPRESSION rules:
156
+ 1. $ cucumber --help
157
+ 2. http://github.com/aslakhellesoy/cucumber/wiki/Tags
158
+
159
+ -T, --title STRING Override report default title, which is different for each view/report.
160
+ This affects the xml 'report' node title and the html head > title attributes.
161
+
162
+ --config-file PATH Specify any of these options in a yml file.
163
+ Order of precedence:
164
+ 1 - command line
165
+ 2 - yaml file
166
+ 3 - these defaults
167
+
168
+ Default: 'cuporter.yml'
169
+
170
+ -d, --dry-run Print the configuration without running any reports.
171
+
172
+ --text-summary Add a summary to the text format.
173
+
174
+ CSS and Javascript asset options:
175
+
176
+ -l, --link-assets Do not inline CSS and js in <style/> and <script/> tags, but link to external files instead.
177
+ Default: 'false' for the tag and feature views, not optional for the
178
+ tree view, which requires external gifs.
179
+
180
+ -c, --copy-public-assets If --output-file is supplied, and you're linking to external
181
+ CSS and JavaScript assets, copy them from 'public/' to 'cuporter_public'
182
+ in the same dir as the output file.
183
+ Sets --use-copied-public-assets to 'true', and
184
+ the html report will link to these files by relative path.
185
+
186
+ Default: 'false'
187
+
188
+ -u, --use-copied-public-assets When running batches of reports, and the assets folder has already been
189
+ created by another call to cuporter with '--copy-public-assets'.
190
+ Set to 'true' automatically along with --copy-public-assets.
191
+
192
+ Default: 'false'
193
+
194
+ Reporting options: on by default but can be turned off:
195
+
196
+ --no-sort Do not sort tags, features, scenarios, or outlines
197
+ --no-number Do not get or show scenario or example numbers, (i.e., do not number the leaf nodes).
198
+ --no-total Do not get or show totals
199
+ --no-show-tags Do not show cucumber tags at the feature, scenario, or outline level.
200
+ --no-show-files Do not show feature file paths.
201
+ --no-leaves Show features only, with no scenarios or outlines.
202
+
183
203
  </pre>
184
204
 
185
205
  h4. Examples
data/Rakefile CHANGED
@@ -54,7 +54,7 @@ namespace :cuporter do
54
54
  RDOC_OPTS = ["--all" , "--quiet" , "--line-numbers" , "--inline-source",
55
55
  "--main", "README.textile",
56
56
  "--title", "Cuporter: cucumber tag reporting"]
57
- XTRA_RDOC = %w{README.textile LICENSE }
57
+ XTRA_RDOC = %w{bin/cuporter README.textile LICENSE }
58
58
 
59
59
  Rake::RDocTask.new do |rd|
60
60
  rd.rdoc_dir = "doc/rdoc"
@@ -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.9'
68
+ s.version = '0.3.10'
69
69
  s.rubyforge_project = s.name
70
70
 
71
71
  s.platform = Gem::Platform::RUBY
@@ -5,28 +5,76 @@ $LOAD_PATH.unshift File.expand_path('../lib', File.dirname(__FILE__))
5
5
  require 'configuration'
6
6
  require 'cuporter'
7
7
 
8
+ module Cuporter
8
9
 
9
- report = Cuporter::ReportBase.create(Cuporter.options).build
10
-
11
- (Cuporter.output_file || STDOUT).puts case Cuporter.options[:format]
12
- when 'xml'
13
- report.doc.to_xml(:indent => 2, :encoding => 'UTF-8')
14
- when 'csv'
15
- report.doc.to_csv
16
- when 'text', 'pretty'
17
- report.doc.to_text
18
- when 'html'
19
- if Cuporter.options[:copy_public_assets]
20
- Cuporter::Document::Assets.copy(Cuporter.options[:output_file])
10
+ #=Default:
11
+ #
12
+ # Single tag report of everything under "features/", formatted as
13
+ # indented text, showing feature names, scenario names, tags, file names, as well as scenario totals and sequence numbers.
14
+ #
15
+ # Configuration:
16
+ #
17
+ # Use the command line options and/or yaml file to turn off everything but
18
+ # the feature names, and also to supply filtering tags (cucumber
19
+ # syntax and logical rules).
20
+ #
21
+ #
22
+ # Split output:
23
+ #
24
+ # Note that a given report can be sent to multiple output targets. For
25
+ # example, html to a file and pretty text or xml to <tt>stdout</tt>. Specify
26
+ # multiple output files, and Cuporter will associate each of their names with the correct
27
+ # format/output stream, but if you get the file extension wrong it will fall
28
+ # back on <tt>stdout</tt>. The possible extensions are <tt>.txt</tt>,
29
+ # <tt>.xml</tt>, <tt>.html</tt>, and <tt>.csv</tt>.
30
+ #
31
+ #
32
+ # Batch reporting:
33
+ #
34
+ # Use the yaml file to specify options for as many reports or views as you
35
+ # like to produce at once.
36
+ def self.run
37
+ Cuporter.option_sets.each do |options|
38
+
39
+ if options.dry_run?
40
+ options.dump
41
+ puts
42
+ next
43
+ end
44
+
45
+ report = Cuporter::ReportBase.create(options).build
46
+
47
+ options[:format].each do |format|
48
+ (options.output_file(format) || STDOUT).puts(
49
+ case format
50
+ when 'xml'
51
+ report.doc.to_xml(:indent => 2, :encoding => 'UTF-8')
52
+ when 'csv'
53
+ Cuporter::Formatters::NodeFormatters.total = options[:total]
54
+ report.doc.to_csv
55
+ when 'text', 'pretty'
56
+ Cuporter::Formatters::NodeFormatters.total = options[:total]
57
+ Cuporter::Formatters::NodeFormatters.text_summary = options[:text_summary]
58
+ report.doc.to_text
59
+ when 'html'
60
+ if options[:copy_public_assets]
61
+ Cuporter::Document::Assets.copy(options[:output_file].first)
62
+ end
63
+ html = Cuporter::Document.new_html(options[:report],
64
+ options[:link_assets],
65
+ options[:use_copied_public_assets])
66
+ formatters = File.expand_path("../lib/cuporter/formatters", File.dirname(__FILE__))
67
+ xslt = Nokogiri::XSLT(File.read("#{formatters}/xml_to_html.xslt"))
68
+ html.add_report(xslt.transform(report.doc).at('.report'))
69
+ html.to_html
70
+ end
71
+ )
72
+ end
73
+ end
21
74
  end
22
- html = Cuporter::Document.new_html(Cuporter.options[:report],
23
- Cuporter.options[:link_assets],
24
- Cuporter.options[:use_copied_public_assets])
25
- formatters = File.expand_path("../lib/cuporter/formatters", File.dirname(__FILE__))
26
- xslt = Nokogiri::XSLT(File.read("#{formatters}/xml_to_html.xslt"))
27
- html.add_report(xslt.transform(report.doc).at('.report'))
28
- html.to_html
29
75
  end
30
76
 
77
+ Cuporter.run
78
+
31
79
  __END__
32
80
  xsltproc --stringparam view feature lib/cuporter/formatters/xml_to_html.xslt new_feature.xml | ruby -e "f = STDIN.read; puts f.gsub(/\<\!--[\*\/]{2}--\>/, '')" | tee xslt_feature.html
@@ -37,7 +37,8 @@ module Cuporter
37
37
  opts.on("-f", "--format [xml|html|csv|text]", %Q{Output format.
38
38
  Default: text (it's pretty, though!)
39
39
  }) do |f|
40
- @options[:format] = f
40
+ @options[:format] = [] unless @options[:format]
41
+ @options[:format] << f
41
42
  end
42
43
 
43
44
  opts.on("-i", "--input-dir DIR", %Q{Root directory of *.feature files.
@@ -59,15 +60,16 @@ module Cuporter
59
60
 
60
61
  opts.on("-o", "--output-file FILE", %Q{Output file path, like 'tmp/cucumber/tag_report.html'.
61
62
  }) do |o|
62
- @options[:output_file] = o
63
+ @options[:output_file] = [] unless @options[:output_file]
64
+ @options[:output_file] << o
63
65
  end
64
66
 
65
- @options[:tags] = []
66
67
  opts.on("-t", "--tags TAG_EXPRESSION", %Q{Filter on tags for name report.
67
68
  TAG_EXPRESSION rules:
68
69
  1. $ cucumber --help
69
70
  2. http://github.com/aslakhellesoy/cucumber/wiki/Tags
70
71
  }) do |t|
72
+ @options[:tags] = [] unless @options[:tags]
71
73
  @options[:tags] << t
72
74
  end
73
75
 
@@ -77,6 +79,27 @@ module Cuporter
77
79
  @options[:title] = title
78
80
  end
79
81
 
82
+ opts.on("--config-file PATH", %Q{Specify any of these options in a yml file.
83
+ Order of precedence:
84
+ 1 - command line
85
+ 2 - yaml file
86
+ 3 - these defaults
87
+
88
+ Default: 'cuporter.yml'
89
+ }) do |path|
90
+ @options[:config_file] = path
91
+ end
92
+
93
+ opts.on("-d", "--dry-run", %Q{Print the configuration without running any reports.
94
+ }) do |d|
95
+ @options[:dry_run] = d
96
+ end
97
+
98
+ opts.on("--text-summary", %Q{Add a summary to the text format.
99
+ }) do |ts|
100
+ @options[:text_summary] = ts
101
+ end
102
+
80
103
  opts.separator "CSS and Javascript asset options:\n\n"
81
104
 
82
105
  opts.on("-l", "--link-assets", %Q{Do not inline CSS and js in <style/> and <script/> tags, but link to external files instead.
@@ -107,17 +130,6 @@ module Cuporter
107
130
  @options[:use_copied_public_assets] = u
108
131
  end
109
132
 
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
133
  opts.separator "Reporting options: on by default but can be turned off:\n\n"
122
134
  opts.on("--no-sort", "Do not sort tags, features, scenarios, or outlines\n") do |n|
123
135
  @options[:sort] = n
@@ -7,67 +7,110 @@ require 'cli/filter_args_builder'
7
7
  module Cuporter
8
8
  module Config
9
9
 
10
- module Options
10
+ class OptionSetCollection
11
11
 
12
- DEFAULTS = { :report => "tag",
13
- :format => "text",
14
- :input_dir => "features",
15
- :tags => [],
16
- :copy_public_assets => false,
12
+ def self.path
13
+ Cuporter::Config::CLI::Options[:config_file] || "cuporter.yml"
14
+ end
15
+
16
+ def self.config_file
17
+ return [] unless File.exists?(path)
18
+
19
+ require 'yaml'
20
+ yaml = YAML.load_file(path)
21
+ if yaml["option_sets"]
22
+ yaml["option_sets"].map do |option_set|
23
+ cast(option_set["options"])
24
+ end
25
+ else
26
+ yaml["defaults"].empty? ? [] : [cast(yaml["defaults"])]
27
+ end
28
+ end
29
+
30
+ def self.cast(option_set)
31
+ pairs = {}
32
+ option_set.each do |key, value|
33
+ pairs[key.to_sym] = case key
34
+ when /^(tags|output_file|format)$/i
35
+ value.is_a?(Array) ? value : [value]
36
+ else
37
+ value
38
+ end
39
+ end
40
+
41
+ return pairs
42
+ end
43
+ end
44
+
45
+ class OptionSet
46
+
47
+ DEFAULTS = { :report => "tag",
48
+ :format => ["text"],
49
+ :input_dir => "features",
50
+ :output_file => [],
51
+ :tags => [],
52
+ :link_assets => false,
53
+ :copy_public_assets => false,
17
54
  :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
55
+ :dry_run => false,
56
+ :sort => true,
57
+ :number => true,
58
+ :total => true,
59
+ :show_tags => true,
60
+ :show_files => true,
61
+ :leaves => true
24
62
  }
25
63
 
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")
64
+ attr_reader :options
65
+
66
+ def initialize(file_config = {})
67
+ # CLI options replace any found in the file
68
+ cli_options_over_file_options = file_config.merge(Cuporter::Config::CLI::Options.options)
30
69
 
31
- # CLI options replace any found in the file
32
- cli_options_over_file_options = file_config.merge(Cuporter::Config::CLI::Options.options)
70
+ # defaults will be used for anything not so far specified in the file
71
+ # or CLI
72
+ @options = post_process(DEFAULTS.merge(cli_options_over_file_options))
73
+ end
74
+
75
+ def [](key)
76
+ @options[key]
77
+ end
33
78
 
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))
79
+ def output_file(format)
80
+ if (file = @options[:output_file].find {|f| f =~ ext_for(format) })
81
+ File.open(file, "w")
37
82
  end
38
- @options
39
83
  end
40
84
 
41
- def self.post_process(options)
85
+ def dump
86
+ col_1_max = @options.keys.max_by {|i| i.to_s.length }.to_s.size
87
+ @options.each do |key, value|
88
+ puts ":#{key.to_s.ljust(col_1_max, ' ')} => #{value.inspect}"
89
+ end
90
+ end
91
+
92
+ def dry_run?
93
+ @options[:dry_run]
94
+ end
95
+
96
+ private
97
+
98
+ def post_process(options)
42
99
  options[:input_file_pattern] = options.delete(:input_file) || "#{options.delete(:input_dir)}/**/*.feature"
43
100
  options[:root_dir] = options[:input_file_pattern].split(File::SEPARATOR).first
44
101
  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
102
+ options[:output_file].each_with_index do |file_path, i|
103
+ options[:output_file][i] = full_path(file_path.dup)
50
104
  end
51
- options
52
- end
53
-
54
- def self.config_file(path)
55
- return {} unless File.exists?(path)
56
105
 
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
106
+ unless options[:output_file].find {|f| f =~ /\.html$/ }
107
+ options[:copy_public_assets] = options[:use_copied_public_assets] = false
66
108
  end
67
- pairs
109
+
110
+ options
68
111
  end
69
112
 
70
- def self.full_path(path)
113
+ def full_path(path)
71
114
  expanded_path = File.expand_path(path)
72
115
  path_nodes = expanded_path.split(File::SEPARATOR)
73
116
  file = path_nodes.pop
@@ -75,20 +118,24 @@ module Cuporter
75
118
  expanded_path
76
119
  end
77
120
 
121
+ def ext_for(format)
122
+ case format
123
+ when 'text', 'pretty'
124
+ /\.txt$/
125
+ else
126
+ /\.#{format}$/
127
+ end
128
+ end
78
129
  end
79
130
  end
80
131
 
81
- def self.html?
82
- Config::Options[:format] == 'html'
132
+ def self.option_sets
133
+ if (yaml_hashes = Config::OptionSetCollection.config_file).any?
134
+ yaml_hashes.map {|set| Config::OptionSet.new(set) }
135
+ else
136
+ [Config::OptionSet.new]
137
+ end
83
138
  end
84
139
 
85
- def self.options
86
- Config::Options.options
87
- end
88
140
 
89
- def self.output_file
90
- if options[:output_file]
91
- File.open(options[:output_file], "w")
92
- end
93
- end
94
141
  end
@@ -11,8 +11,7 @@ module Cuporter
11
11
  end
12
12
 
13
13
  def self.new_html(view, link_assets, use_copied_public_assets)
14
- Nokogiri::XML::Document.send(:include, Cuporter::Document::Html)
15
- doc = Nokogiri::XML::Document.new
14
+ doc = Cuporter::Document::Html.new
16
15
  doc.view = view
17
16
  doc.link_assets = link_assets
18
17
  doc.assets_src = Assets::PUBLIC_SOURCE_PATH
@@ -1,7 +1,7 @@
1
1
  # Copyright 2011 ThoughtWorks, Inc. Licensed under the MIT License
2
2
  module Cuporter
3
3
  module Document
4
- module Html
4
+ class Html < Nokogiri::XML::Document
5
5
  attr_accessor :view, :link_assets, :assets_src, :assets_base_path
6
6
 
7
7
  def assets_base_path
@@ -13,11 +13,7 @@ module Cuporter
13
13
  end
14
14
 
15
15
  def total_column_spacer
16
- @@total_column_spacer ||= Cuporter.options[:total] ? tab_stop : ""
17
- end
18
-
19
- def total_column
20
- @@total_column ||= total_column_spacer
16
+ @@total_column_spacer ||= NodeFormatters.total ? tab_stop : ""
21
17
  end
22
18
 
23
19
  def total(node)
@@ -14,8 +14,12 @@ module Cuporter
14
14
  end
15
15
 
16
16
  module NodeFormatters
17
+ class << self
18
+ attr_accessor :total, :text_summary
19
+ end
20
+
17
21
  def report(l, node)
18
- return l unless Cuporter.options[:text_summary]
22
+ return l unless NodeFormatters.text_summary
19
23
  l += total(node)
20
24
  l += cuke_name(node['cuke_name'])
21
25
  l += title(node['title'])
@@ -89,7 +93,6 @@ module Cuporter
89
93
  module Text
90
94
  extend Util
91
95
  extend NodeFormatters
92
-
93
96
 
94
97
  SPACER = " "
95
98
  def tab_stop
@@ -97,16 +100,12 @@ module Cuporter
97
100
  end
98
101
 
99
102
  def total_column_spacer
100
- @@total_column_spacer ||= Cuporter.options[:total] ? tab_stop : ""
101
- end
102
-
103
- def total_column
104
- @@total_column ||= Cuporter.options[:total] ? tab_stop * 2: ""
103
+ @@total_column_spacer ||= NodeFormatters.total ? tab_stop : ""
105
104
  end
106
105
 
107
106
  def total(node)
108
107
  format_number(node, 'total') do |indent_length, value|
109
- "[#{value}]".ljust(total_column.size, SPACER)
108
+ "[#{value}]".ljust(indent_length, SPACER)
110
109
  end
111
110
  end
112
111
 
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: 1
4
+ hash: 7
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 3
9
- - 9
10
- version: 0.3.9
9
+ - 10
10
+ version: 0.3.10
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-06-14 00:00:00 -04:00
18
+ date: 2011-06-28 00:00:00 -04:00
19
19
  default_executable: cuporter
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -41,6 +41,7 @@ executables:
41
41
  extensions: []
42
42
 
43
43
  extra_rdoc_files:
44
+ - bin/cuporter
44
45
  - README.textile
45
46
  - LICENSE
46
47
  files: