cuporter 0.3.9 → 0.3.10

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.
@@ -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: