choosy 0.2.5 → 0.3.0

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.
Files changed (58) hide show
  1. data/CHANGELOG.md +8 -0
  2. data/LICENSE +2 -0
  3. data/README.markdown +102 -54
  4. data/Rakefile +27 -5
  5. data/TODO.md +5 -0
  6. data/examples/bar.rb +9 -7
  7. data/examples/foo.rb +9 -7
  8. data/examples/superfoo.rb +48 -36
  9. data/lib/VERSION.yml +6 -0
  10. data/lib/choosy/argument.rb +5 -0
  11. data/lib/choosy/base_command.rb +11 -10
  12. data/lib/choosy/command.rb +17 -1
  13. data/lib/choosy/converter.rb +5 -1
  14. data/lib/choosy/dsl/argument_builder.rb +33 -21
  15. data/lib/choosy/dsl/base_builder.rb +26 -0
  16. data/lib/choosy/dsl/base_command_builder.rb +23 -30
  17. data/lib/choosy/dsl/command_builder.rb +8 -12
  18. data/lib/choosy/dsl/option_builder.rb +14 -45
  19. data/lib/choosy/dsl/super_command_builder.rb +17 -20
  20. data/lib/choosy/errors.rb +1 -0
  21. data/lib/choosy/option.rb +19 -0
  22. data/lib/choosy/printing/base_printer.rb +231 -0
  23. data/lib/choosy/printing/color.rb +8 -5
  24. data/lib/choosy/printing/erb_printer.rb +1 -1
  25. data/lib/choosy/printing/help_printer.rb +49 -163
  26. data/lib/choosy/printing/manpage.rb +235 -0
  27. data/lib/choosy/printing/manpage_printer.rb +95 -0
  28. data/lib/choosy/printing/terminal.rb +39 -8
  29. data/lib/choosy/printing.rb +1 -0
  30. data/lib/choosy/super_command.rb +13 -4
  31. data/lib/choosy/super_parser.rb +5 -1
  32. data/lib/choosy/verifier.rb +8 -0
  33. data/lib/choosy/version.rb +64 -5
  34. data/spec/choosy/argument_spec.rb +28 -0
  35. data/spec/choosy/base_command_spec.rb +7 -3
  36. data/spec/choosy/command_spec.rb +2 -2
  37. data/spec/choosy/converter_spec.rb +3 -2
  38. data/spec/choosy/dsl/argument_builder_spec.rb +19 -8
  39. data/spec/choosy/dsl/base_builder_spec.rb +43 -0
  40. data/spec/choosy/dsl/base_command_builder_spec.rb +7 -9
  41. data/spec/choosy/dsl/commmand_builder_spec.rb +9 -1
  42. data/spec/choosy/dsl/option_builder_spec.rb +1 -65
  43. data/spec/choosy/dsl/super_command_builder_spec.rb +19 -8
  44. data/spec/choosy/option_spec.rb +68 -0
  45. data/spec/choosy/printing/base_printer_spec.rb +155 -0
  46. data/spec/choosy/printing/color_spec.rb +4 -0
  47. data/spec/choosy/printing/help_printer_spec.rb +15 -109
  48. data/spec/choosy/printing/manpage_printer_spec.rb +95 -0
  49. data/spec/choosy/printing/manpage_spec.rb +206 -0
  50. data/spec/choosy/super_command_spec.rb +7 -0
  51. data/spec/choosy/super_parser_spec.rb +9 -0
  52. data/spec/choosy/verifier_spec.rb +31 -1
  53. data/spec/choosy/version.yml +5 -0
  54. data/spec/choosy/version_spec.rb +87 -0
  55. data/spec/integration/command-C_spec.rb +23 -0
  56. data/spec/integration/supercommand-C_spec.rb +45 -0
  57. metadata +81 -78
  58. data/lib/VERSION +0 -1
@@ -0,0 +1,235 @@
1
+ require 'choosy/errors'
2
+
3
+ module Choosy::Printing
4
+ class ManpageFormatter
5
+ def bold(line=nil)
6
+ if line.nil?
7
+ '\\fB'
8
+ else
9
+ "\\fB#{line}\\fP"
10
+ end
11
+ end
12
+
13
+ def italics(line=nil)
14
+ if line.nil?
15
+ '\\fI'
16
+ else
17
+ "\\fI#{line}\\fP"
18
+ end
19
+ end
20
+
21
+ def roman(line=nil)
22
+ if line.nil?
23
+ '\\fR'
24
+ else
25
+ "\\fR#{line}\\fP"
26
+ end
27
+ end
28
+
29
+ def reset
30
+ '\\fP'
31
+ end
32
+ end
33
+
34
+ class Manpage
35
+ attr_accessor :name, :section, :date, :version, :manual
36
+ attr_reader :format, :buffer
37
+
38
+ def initialize
39
+ @buffer = []
40
+ @section = 1
41
+ @format = ManpageFormatter.new
42
+ @version = nil
43
+ @date = nil
44
+ @manual = nil
45
+ end
46
+
47
+ def frame_outline
48
+ frame = ".TH"
49
+ quote(frame, @name)
50
+ quote(frame, @section)
51
+ quote(frame, @date)
52
+ quote(frame, @version)
53
+ quote(frame, @manual)
54
+ frame
55
+ end
56
+
57
+ def section_heading(line)
58
+ prefixed('.SH', heading(line))
59
+ end
60
+
61
+ def subsection_heading(line)
62
+ prefixed('.SS', heading(line))
63
+ end
64
+
65
+ def paragraph(line=nil)
66
+ line = if line.nil?
67
+ '.P'
68
+ else
69
+ ".P\n" << line
70
+ end
71
+ append(line)
72
+ end
73
+
74
+ def indented_paragraph(item, line)
75
+ prefixed('.IP', escape(item), escape(line))
76
+ end
77
+
78
+ def hanging_paragraph(line)
79
+ append(".HP\n" << escape(line))
80
+ end
81
+
82
+ def indented_region
83
+ append('.RE')
84
+ end
85
+
86
+ def text(line)
87
+ return if line.nil?
88
+ append(escape(line))
89
+ end
90
+
91
+ def raw(line)
92
+ return if line.nil?
93
+ append(line)
94
+ end
95
+
96
+ def bold(line, type=nil)
97
+ line = escape(line)
98
+ case type
99
+ when nil
100
+ prefixed('.B', line)
101
+ when :italics
102
+ prefixed('.BI', line)
103
+ when :roman
104
+ prefixed('.BR', line)
105
+ else
106
+ raise Choosy::ConfigurationError.new("Undefined manpage bold type: #{type}")
107
+ end
108
+ end
109
+
110
+ def italics(line, type=nil)
111
+ line = escape(line)
112
+ case type
113
+ when nil
114
+ prefixed('.I', line)
115
+ when :bold
116
+ prefixed('.IB', line)
117
+ when :roman
118
+ prefixed('.IR', line)
119
+ else
120
+ raise Choosy::ConfigurationError.new("Undefined manpage italics type: #{type}")
121
+ end
122
+ end
123
+
124
+ def roman(line, type)
125
+ line = escape(line)
126
+ case type
127
+ when :italics
128
+ prefixed('.RI', line)
129
+ when :bold
130
+ prefixed('.RB', line)
131
+ else
132
+ raise Choosy::ConfigurationError.new("Undefined manpage for roman type: #{type}")
133
+ end
134
+ end
135
+
136
+ def small(line, type=nil)
137
+ line = escape(line)
138
+ case type
139
+ when nil
140
+ prefixed('.SM', line)
141
+ when :bold
142
+ prefixed('.SB', line)
143
+ else
144
+ raise Choosy::ConfigurationError.new("Undefined manpage for small type: #{type}")
145
+ end
146
+ end
147
+
148
+ def comment(line)
149
+ append('./" ' << line)
150
+ end
151
+
152
+ def line_break
153
+ append('.br')
154
+ end
155
+
156
+ def nofill(&block)
157
+ if block_given?
158
+ append('.nf')
159
+ yield self
160
+ append('.fi')
161
+ else
162
+ append('.nf')
163
+ end
164
+ end
165
+
166
+ def fill
167
+ append('.fi')
168
+ end
169
+
170
+ def term_paragraph(term, para, width=5)
171
+ append(".TP " << width.to_s << NEWLINE << escape(term) << NEWLINE << escape(para))
172
+ end
173
+
174
+ def to_s(io=nil)
175
+ io ||= ""
176
+ io << frame_outline << NEWLINE
177
+ io << PREFACE
178
+ @buffer.each do |line|
179
+ io << line
180
+ io << NEWLINE
181
+ end
182
+ io
183
+ end
184
+
185
+ private
186
+ # Taken from the Debian best practices
187
+ PREFACE =<<EOF
188
+ .ie \\n(.g .ds Aq \\(aq
189
+ .el .ds Aq '
190
+ .\\" disable hyphenation
191
+ .nh
192
+ .\\" disable justification (adjust text to left margin only)
193
+ .ad l
194
+ EOF
195
+ SQUOTE = ' "'
196
+ EQUOTE = '"'
197
+ NEWLINE = "\n"
198
+
199
+ def quote(base, val)
200
+ if val
201
+ base << SQUOTE << val.to_s << EQUOTE
202
+ else
203
+ base << SQUOTE << ' ' << EQUOTE
204
+ end
205
+ end
206
+
207
+ def prefixed(tag, quot, line=nil)
208
+ puts tag if quot.nil?
209
+ tag << SQUOTE << quot << EQUOTE
210
+ if line.nil?
211
+ append(tag)
212
+ else
213
+ append(tag << NEWLINE << line)
214
+ end
215
+ end
216
+
217
+ def append(line)
218
+ @buffer << line
219
+ line
220
+ end
221
+
222
+ def escape(line)
223
+ nline = line.gsub(/-/, "\\-")
224
+ nline.gsub!(/(\.+)/, '&\1')
225
+ nline
226
+ end
227
+
228
+ def heading(line)
229
+ nline = escape(line)
230
+ nline.upcase!
231
+ nline.gsub!(/:$/, '')
232
+ nline
233
+ end
234
+ end
235
+ end
@@ -0,0 +1,95 @@
1
+ require 'choosy/errors'
2
+ require 'choosy/option'
3
+ require 'choosy/dsl/option_builder'
4
+ require 'choosy/printing/base_printer'
5
+ require 'choosy/printing/manpage'
6
+
7
+ module Choosy::Printing
8
+ class ManpagePrinter < BasePrinter
9
+ attr_reader :manpage, :name, :synopsis
10
+
11
+ def initialize(options={})
12
+ super(options)
13
+
14
+ @name = options[:name] || "NAME"
15
+ @synopsis = options[:synopsis] || 'SYNOPSIS'
16
+
17
+ @manpage = Manpage.new
18
+ @manpage.section = options[:section] || 1
19
+ @manpage.date = options[:date]
20
+ @manpage.manual = options[:manual]
21
+ @manpage.version = options[:version]
22
+ end
23
+
24
+ def print!(command)
25
+ if pager?
26
+ fix_termcap
27
+ page format!(command), 'groff -Tutf8 -mandoc'
28
+ else
29
+ # Fall back to a help printer if there is no pager
30
+ help = HelpPrinter.new(formatting_options)
31
+ help.print!(command)
32
+ end
33
+ end
34
+
35
+ def format_prologue(command)
36
+ @manpage.name = command_name(command)
37
+ version_option = command.option_builders[Choosy::DSL::OptionBuilder::VERSION]
38
+ if version_option && @manpage.version.nil?
39
+ begin
40
+ version_option.entity.validation_step.call(nil, nil)
41
+ rescue Choosy::VersionCalled => e
42
+ @manpage.version = e.message
43
+ end
44
+ end
45
+
46
+ format_name(command)
47
+ format_synopsis(command)
48
+ end
49
+
50
+ def format_name(command)
51
+ if command.summary
52
+ @manpage.section_heading(@name)
53
+ @manpage.text("#{command.name} - #{command.summary}")
54
+ end
55
+ end
56
+
57
+ def format_synopsis(command)
58
+ @manpage.section_heading(@synopsis)
59
+ @manpage.nofill do |man|
60
+ usage_wrapped(command, '', columns).each do |line|
61
+ man.text line
62
+ end
63
+ end
64
+ end
65
+
66
+ def format_option(option, formatted_option, indent)
67
+ @manpage.term_paragraph(formatted_option, option.description, indent.length)
68
+ end
69
+
70
+ def format_command(command, formatted_command, indent)
71
+ @manpage.term_paragraph(formatted_command, command.summary || "", indent.length)
72
+ end
73
+
74
+ def format_element(item)
75
+ if item.header?
76
+ @manpage.section_heading(item.value)
77
+ else
78
+ @manpage.paragraph(item.value)
79
+ end
80
+ end
81
+
82
+ def format_epilogue(command)
83
+ @manpage.to_s
84
+ end
85
+
86
+ protected
87
+ def option_begin
88
+ @manpage.format.italics
89
+ end
90
+
91
+ def option_end
92
+ @manpage.format.reset
93
+ end
94
+ end
95
+ end
@@ -6,26 +6,57 @@ module Choosy::Printing
6
6
  DEFAULT_LINE_COUNT = 25
7
7
  DEFAULT_COLUMN_COUNT = 80
8
8
 
9
+ attr_writer :lines, :columns
10
+
9
11
  def lines
10
12
  @lines ||= find_terminal_size('LINES', 'lines', 0) || DEFAULT_LINE_COUNT
11
13
  end
12
14
 
13
- def lines=(value)
14
- @lines = value
15
- end
16
-
17
15
  def columns
18
16
  @columns ||= find_terminal_size('COLUMNS', 'cols', 1) || DEFAULT_COLUMN_COUNT
19
17
  end
20
18
 
21
- def columns=(value)
22
- @columns = value
23
- end
24
-
25
19
  def color
26
20
  @color ||= Color.new
27
21
  end
28
22
 
23
+ def pager?
24
+ !pager.empty?
25
+ end
26
+
27
+ def pager
28
+ @pager ||= ENV['PAGER'] || ENV['MANPAGER']
29
+ return @pager if @pager
30
+
31
+ @pager = if command_exists?('less')
32
+ 'less -R'
33
+ elsif command_exists?('more')
34
+ 'more'
35
+ else
36
+ ''
37
+ end
38
+ end
39
+
40
+ def page(contents, pipe_command=nil)
41
+ if pager?
42
+ if pipe_command
43
+ pipe(contents, "#{pipe_command} | #{pager}")
44
+ else
45
+ pipe(contents, pager)
46
+ end
47
+ else
48
+ pipe(contents, pipe_command)
49
+ end
50
+ end
51
+
52
+ def pipe(contents, command)
53
+ puts contents if command.nil?
54
+
55
+ IO.popen(command, 'w') do |f|
56
+ f.puts contents
57
+ end
58
+ end
59
+
29
60
  # directly from hirb
30
61
  def command_exists?(command)
31
62
  ENV['PATH'].split(File::PATH_SEPARATOR).any? {|d| File.exists? File.join(d, command) }
@@ -0,0 +1 @@
1
+
@@ -6,14 +6,14 @@ require 'choosy/dsl/super_command_builder'
6
6
 
7
7
  module Choosy
8
8
  class SuperCommand < BaseCommand
9
- attr_accessor :metaname
9
+ attr_accessor :metaname, :default_command
10
10
 
11
11
  def command_builders
12
12
  @command_builders ||= {}
13
13
  end
14
14
 
15
15
  def commands
16
- @command_builders.values.map {|b| b.command }
16
+ @command_builders.values.map {|b| b.entity }
17
17
  end
18
18
 
19
19
  def parsimonious=(value)
@@ -44,6 +44,15 @@ module Choosy
44
44
  end
45
45
  end
46
46
 
47
+ def has_default?
48
+ !@default_command.nil?
49
+ end
50
+
51
+ def finalize!
52
+ super
53
+ @metaname ||= 'COMMAND'
54
+ end
55
+
47
56
  protected
48
57
  def create_builder
49
58
  Choosy::DSL::SuperCommandBuilder.new(self)
@@ -58,11 +67,11 @@ module Choosy
58
67
  command_name = hc.message
59
68
 
60
69
  if command_name == Choosy::DSL::SuperCommandBuilder::SUPER
61
- puts printer.print!(self)
70
+ printer.print!(self)
62
71
  else
63
72
  builder = command_builders[command_name]
64
73
  if builder
65
- puts printer.print!(builder.command)
74
+ printer.print!(builder.entity)
66
75
  else
67
76
  $stdout << "#{@name}: #{format_help(command_name)}\n"
68
77
  exit 1
@@ -52,6 +52,8 @@ module Choosy
52
52
  end
53
53
 
54
54
  def parse_globals(args)
55
+ count = args.count
56
+
55
57
  result = SuperParseResult.new(@super_command)
56
58
  parser = Parser.new(@super_command, true, @terminals)
57
59
  parser.parse!(args, result)
@@ -61,6 +63,8 @@ module Choosy
61
63
  if result.unparsed.length == 0
62
64
  if @super_command.command_builders[Choosy::DSL::SuperCommandBuilder::HELP]
63
65
  raise Choosy::HelpCalled.new(Choosy::DSL::SuperCommandBuilder::SUPER)
66
+ elsif count == 0 && @super_command.has_default?
67
+ result.unparsed << @super_command.default_command.to_s
64
68
  else
65
69
  raise Choosy::SuperParseError.new("requires a command")
66
70
  end
@@ -80,7 +84,7 @@ module Choosy
80
84
  end
81
85
  end
82
86
 
83
- command = command_builder.command
87
+ command = command_builder.entity
84
88
  parser = Parser.new(command, false, terminals)
85
89
  command_result = Choosy::ParseResult.new(command, true)
86
90
  parser.parse!(args, command_result)
@@ -34,12 +34,20 @@ module Choosy
34
34
  if result.command.arguments
35
35
  arguments = result.command.arguments
36
36
 
37
+ result.args.map! do |value|
38
+ Converter.convert(arguments.cast_to, value)
39
+ end
40
+
37
41
  if result.args.length < arguments.arity.min
38
42
  raise Choosy::ValidationError.new("#{prefix}too few arguments (minimum is #{arguments.arity.min})")
39
43
  elsif result.args.length > arguments.arity.max
40
44
  raise Choosy::ValidationError.new("#{prefix}too many arguments (max is #{arguments.arity.max}): '#{result.args[arguments.arity.max]}'")
41
45
  end
42
46
 
47
+ result.args.each do |val|
48
+ check(arguments.allowable_values, val)
49
+ end if arguments.restricted?
50
+
43
51
  if arguments.validation_step
44
52
  arguments.validation_step.call(result.args, result.options)
45
53
  end
@@ -1,12 +1,71 @@
1
- require 'scanf'
1
+ require 'yaml'
2
+ require 'time'
3
+ require 'choosy/errors'
2
4
 
3
5
  module Choosy
4
6
  class Version
5
- CURRENT = File.read(File.join(File.dirname(__FILE__), '..', 'VERSION'))
6
- MAJOR, MINOR, TINY = CURRENT.scanf('%d.%d.%d')
7
+ attr_accessor :date_format, :version_file
7
8
 
8
- def self.to_s
9
- CURRENT
9
+ def initialize(version_file, date_format='%d/%m/%Y')
10
+ if !File.file?(version_file)
11
+ raise Choosy::ConfigurationError.new("No version file given: #{version_file}")
12
+ end
13
+
14
+ @version_file = version_file
15
+ @date_format = date_format
16
+ reload!
17
+ end
18
+
19
+ def tiny
20
+ @contents[VERSION][TINY]
21
+ end
22
+
23
+ def minor
24
+ @contents[VERSION][MINOR]
25
+ end
26
+
27
+ def major
28
+ @contents[VERSION][MAJOR]
29
+ end
30
+
31
+ def date
32
+ @contents[DATE]
10
33
  end
34
+
35
+ def reload!
36
+ @contents = YAML.load_file(@version_file)
37
+ end
38
+
39
+ def version!(kind)
40
+ kind = kind.to_s
41
+ unless VERSIONS.include?(kind)
42
+ raise Choosy::VersionError.new("Wrong versioning schema: #{kind}")
43
+ end
44
+
45
+ VERSIONS.each do |vers|
46
+ if vers == kind
47
+ @contents[VERSION][kind] += 1
48
+ break
49
+ else
50
+ @contents[VERSION][vers] = 0
51
+ end
52
+ end
53
+ @contents[DATE] = Time.now.strftime(@date_format)
54
+ File.open(@version_file, 'w') do |out|
55
+ YAML.dump(@contents, out)
56
+ end
57
+ end
58
+
59
+ def to_s
60
+ "#{major}.#{minor}.#{tiny}"
61
+ end
62
+
63
+ private
64
+ VERSION = 'version'
65
+ TINY = 'tiny'
66
+ MINOR = 'minor'
67
+ MAJOR = 'major'
68
+ VERSIONS = [TINY, MINOR, MAJOR]
69
+ DATE = 'date'
11
70
  end
12
71
  end
@@ -0,0 +1,28 @@
1
+ require 'spec_helpers'
2
+ require 'choosy/argument'
3
+
4
+ module Choosy
5
+ describe Argument do
6
+ before :each do
7
+ @argument = Argument.new
8
+ end
9
+
10
+ describe :restricted? do
11
+ it "should be false when there are no allowable_values" do
12
+ @argument.restricted?.should be(false)
13
+ end
14
+
15
+ it "should be true when there are allowable_values" do
16
+ @argument.allowable_values = [:a]
17
+ @argument.restricted?.should be(true)
18
+ end
19
+ end
20
+
21
+ describe :finalize! do
22
+ it "should set the arity if not already set" do
23
+ @argument.finalize!
24
+ @argument.arity.should eql(0..0)
25
+ end
26
+ end#finalize!
27
+ end
28
+ end
@@ -6,9 +6,13 @@ module Choosy
6
6
  before :each do
7
7
  @cmd = Command.new :cmd
8
8
  end
9
- it "should finalize the builder" do
10
- @cmd.printer.should be_a(Choosy::Printing::HelpPrinter)
11
- end
9
+
10
+ describe :finalize! do
11
+ it "should set the printer if not already set" do
12
+ @cmd.finalize!
13
+ @cmd.printer.should be_a(Choosy::Printing::HelpPrinter)
14
+ end
15
+ end#finalize!
12
16
 
13
17
  it "should order the options in dependency order" do
14
18
  @cmd.alter do
@@ -37,7 +37,7 @@ module Choosy
37
37
  }.should raise_error(SystemExit)
38
38
  end
39
39
 
40
- o.should match(/-h, --help/)
40
+ o.should match(/--help/)
41
41
  end
42
42
 
43
43
  it "should make sure that help gets check before other required options" do
@@ -52,7 +52,7 @@ module Choosy
52
52
  }.should raise_error(SystemExit)
53
53
  end
54
54
 
55
- o.should match(/-h, --help/)
55
+ o.should match(/--help/)
56
56
  end
57
57
  end
58
58
 
@@ -106,8 +106,9 @@ module Choosy
106
106
  end
107
107
 
108
108
  it "should be able to parse a good yaml file" do
109
- y = Converter.convert(:yaml, File.join(File.dirname(__FILE__), '..', '..', 'lib', 'VERSION'))
110
- y.should eql(Choosy::Version.to_s.chomp)
109
+ version_file = File.join(File.dirname(__FILE__), '..', '..', 'lib', 'VERSION.yml')
110
+ y = Converter.convert(:yaml, version_file)
111
+ y['version']['major'].should eql(Choosy::Version.new(version_file).major)
111
112
  end
112
113
  end
113
114
 
@@ -5,7 +5,7 @@ module Choosy::DSL
5
5
  describe ArgumentBuilder do
6
6
  before :each do
7
7
  @builder = ArgumentBuilder.new
8
- @argument = @builder.argument
8
+ @argument = @builder.entity
9
9
  end
10
10
 
11
11
  describe :required do
@@ -25,6 +25,24 @@ module Choosy::DSL
25
25
  end
26
26
  end#required
27
27
 
28
+ describe :only do
29
+ it "should require at least one argument" do
30
+ attempting {
31
+ @builder.only
32
+ }.should raise_error(Choosy::ConfigurationError, /'only'/)
33
+ end
34
+
35
+ it "should set the allowable_values for an option" do
36
+ @builder.only :this, :that, :other
37
+ @argument.allowable_values.should eql([:this, :that, :other])
38
+ end
39
+
40
+ it "should cast to a symbol if not already set" do
41
+ @builder.only :this, :that, :other
42
+ @argument.cast_to.should eql(:symbol)
43
+ end
44
+ end#only
45
+
28
46
  describe :metaname do
29
47
  it "should be able to set the name of the metaname" do
30
48
  @builder.metaname 'PARAM'
@@ -168,13 +186,6 @@ module Choosy::DSL
168
186
  value.should eql('here')
169
187
  end
170
188
  end#validate
171
-
172
- describe :finalize! do
173
- it "should set the arity if not already set" do
174
- @builder.finalize!
175
- @argument.arity.should eql(0..0)
176
- end
177
- end#finalize!
178
189
  end
179
190
  end
180
191