choosy 0.3.0 → 0.3.1

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/Gemfile CHANGED
@@ -1,7 +1,3 @@
1
1
  source "http://rubygems.org"
2
+ gemspec
2
3
 
3
- group :development do
4
- gem 'rspec', :require => "spec"
5
- gem 'autotest'
6
- gem 'autotest-notification'
7
- end
data/Gemfile.lock CHANGED
@@ -1,3 +1,8 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ choosy ()
5
+
1
6
  GEM
2
7
  remote: http://rubygems.org/
3
8
  specs:
@@ -22,4 +27,5 @@ PLATFORMS
22
27
  DEPENDENCIES
23
28
  autotest
24
29
  autotest-notification
25
- rspec
30
+ choosy!
31
+ rspec (~> 2.5)
data/Rakefile CHANGED
@@ -1,32 +1,23 @@
1
- # $LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
2
- # $LOAD_PATH.unshift File.expand_path("../spec", __FILE__)
1
+ begin
2
+ require 'choosy/versiontask'
3
+ rescue LoadError => e
4
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), 'lib')
5
+ require 'choosy/versiontask'
6
+ end
3
7
 
4
8
  require 'rubygems'
5
9
  require 'rake'
6
- #require 'rake/rdoctask'
7
10
  require 'rspec/core/rake_task'
8
- require './lib/choosy/version'
11
+ require 'bundler'
12
+ Bundler::GemHelper.install_tasks
9
13
 
10
14
  PACKAGE_NAME = "choosy"
11
- PACKAGE_VERSION = Choosy::Version.new(File.join(File.dirname(__FILE__), 'lib', 'VERSION.yml'))
12
15
 
13
16
  desc "Default task"
14
17
  task :default => [ :spec ]
15
18
 
16
- namespace :version do
17
- desc "Tiny bump"
18
- task :tiny do
19
- PACKAGE_VERSION.version!(:tiny)
20
- end
21
- desc "Minor bump"
22
- task :minor do
23
- PACKAGE_VERSION.version!(:minor)
24
- end
25
- desc "Major bump"
26
- task :major do
27
- PACKAGE_VERSION.version!(:major)
28
- end
29
- end
19
+ desc "Run the RSpec tests"
20
+ RSpec::Core::RakeTask.new :spec
30
21
 
31
22
  desc "Build documentation"
32
23
  task :doc => [ :rdoc ] do
@@ -58,27 +49,6 @@ end
58
49
  desc "Create RDocs: TODO"
59
50
  task :rdoc
60
51
 
61
- desc "Run the RSpec tests"
62
- RSpec::Core::RakeTask.new :spec
63
-
64
- begin
65
- require 'jeweler'
66
- Jeweler::Tasks.new do |gem|
67
- gem.name = PACKAGE_NAME
68
- gem.version = PACKAGE_VERSION.to_s
69
- gem.summary = 'Yet another option parsing library.'
70
- gem.description = 'This is a DSL for creating more complicated command line tools.'
71
- gem.email = ['madeonamac@gmail.com']
72
- gem.authors = ['Gabe McArthur']
73
- gem.homepage = 'http://github.com/gabemc/choosy'
74
- gem.files = FileList["[A-Z]*", "{bin,lib,spec}/**/*"]
75
-
76
- gem.add_development_dependency 'rspec', '~> 2.5'
77
- end
78
- rescue LoadError
79
- puts "Jeweler or dependencies are not available. Install it with: gem install jeweler"
80
- end
81
-
82
52
  desc "Cleans the generated files."
83
53
  task :clean do
84
54
  rm Dir.glob('*.gemspec')
@@ -87,9 +57,11 @@ task :clean do
87
57
  end
88
58
 
89
59
  desc "Deploys the gem to rubygems.org"
90
- task :gem => [:doc, :release] do
91
- system("gem build #{PACKAGE_NAME}.gemspec")
92
- system("gem push #{PACKAGE_NAME}-#{PACKAGE_VERSION}.gem")
60
+ task :gem => [:doc, :version] do
61
+ sh "gem build #{PACKAGE_NAME}.gemspec"
62
+ sh "gem push #{PACKAGE_NAME}-#{$version}.gem"
63
+ sh "git tag -m 'Tagging release #{$version}' v#{$version}"
64
+ sh "git push origin :refs/tags/#{$version}"
93
65
  end
94
66
 
95
67
  desc "Does the full release cycle."
data/lib/VERSION.yml CHANGED
@@ -2,5 +2,5 @@
2
2
  version:
3
3
  major: 0
4
4
  minor: 3
5
- tiny: 0
5
+ tiny: 1
6
6
  date: 25/03/2011
@@ -146,7 +146,7 @@ module Choosy::Printing
146
146
  end
147
147
 
148
148
  def comment(line)
149
- append('./" ' << line)
149
+ append('.\\" ' << line)
150
150
  end
151
151
 
152
152
  def line_break
@@ -173,6 +173,7 @@ module Choosy::Printing
173
173
 
174
174
  def to_s(io=nil)
175
175
  io ||= ""
176
+ io << "'\\\" t\n"
176
177
  io << frame_outline << NEWLINE
177
178
  io << PREFACE
178
179
  @buffer.each do |line|
@@ -22,9 +22,9 @@ module Choosy::Printing
22
22
  end
23
23
 
24
24
  def print!(command)
25
- if pager?
25
+ if command_exists?('groff') && pager?
26
26
  fix_termcap
27
- page format!(command), 'groff -Tutf8 -mandoc'
27
+ page format!(command), 'groff -t -e -W all -Tutf8 -mandoc'
28
28
  else
29
29
  # Fall back to a help printer if there is no pager
30
30
  help = HelpPrinter.new(formatting_options)
@@ -60,6 +60,28 @@ module Choosy
60
60
  "#{major}.#{minor}.#{tiny}"
61
61
  end
62
62
 
63
+ def self.load(options)
64
+ basepath = if options[:file] && options[:relpath]
65
+ File.join(File.dirname(options[:file]), options[:relpath])
66
+ elsif options[:dir]
67
+ if options[:relpath]
68
+ File.join(options[:dir], options[:relpath])
69
+ else
70
+ options[:dir]
71
+ end
72
+ else
73
+ Choosy::ConfigurationError.new("No file given.")
74
+ end
75
+
76
+ [File.join(basepath, 'VERSION.yml'), File.join(basepath, 'version.yml')].each do |path|
77
+ if File.exist?(path)
78
+ return Version.new(path)
79
+ end
80
+ end
81
+
82
+ raise Choosy::ConfigurationError.new("No version file given from: #{basepath}")
83
+ end
84
+
63
85
  private
64
86
  VERSION = 'version'
65
87
  TINY = 'tiny'
@@ -0,0 +1,30 @@
1
+
2
+ # This is a library task that others can use to expose functionality in their rake files
3
+ # It defines the '$version' global variable to let users pull this information out
4
+ # into their own scripts.
5
+
6
+ require 'choosy/version'
7
+
8
+ desc "Shows the current version number."
9
+ task :version => ['version:load'] do
10
+ puts "Current version: #{$version.to_s}"
11
+ end
12
+
13
+ namespace :version do
14
+ task :load do
15
+ puts Dir.pwd
16
+ if ENV['VERSION_FILE']
17
+ $version = Choosy::Version.new(ENV['VERSION_FILE'])
18
+ else
19
+ $version = Choosy::Version.load(:dir => Dir.pwd, :relpath => 'lib')
20
+ end
21
+ end
22
+
23
+ [:tiny, :minor, :major].each do |type|
24
+ desc "Bumps the #{type} revision number."
25
+ task type => :load do
26
+ $version.version!(type)
27
+ puts "New version: #{$version.to_s}"
28
+ end
29
+ end
30
+ end
@@ -147,7 +147,7 @@ module Choosy::Printing
147
147
  end
148
148
 
149
149
  it "should allow for comments" do
150
- @man.comment("here").should eql('./" here')
150
+ @man.comment("here").should eql('.\\" here')
151
151
  end
152
152
 
153
153
  it "should allow for line breaks" do
@@ -188,6 +188,7 @@ module Choosy::Printing
188
188
  @man.paragraph('this is a line of text')
189
189
 
190
190
  @man.to_s.should eql(<<EOF
191
+ '\\" t
191
192
  .TH "blah" "1" "today" " " " "
192
193
  .ie \\n(.g .ds Aq \\(aq
193
194
  .el .ds Aq '
metadata CHANGED
@@ -1,194 +1,172 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: choosy
3
- version: !ruby/object:Gem::Version
4
- version: 0.3.0
5
- prerelease:
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 3
8
+ - 1
9
+ version: 0.3.1
6
10
  platform: ruby
7
- authors:
11
+ authors:
8
12
  - Gabe McArthur
9
13
  autorequire:
10
14
  bindir: bin
11
15
  cert_chain: []
12
- date: 2011-03-25 00:00:00.000000000 -07:00
16
+
17
+ date: 2011-03-25 00:00:00 -07:00
13
18
  default_executable:
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
16
21
  name: rspec
17
- requirement: &81909430 !ruby/object:Gem::Requirement
18
- none: false
19
- requirements:
20
- - - ! '>='
21
- - !ruby/object:Gem::Version
22
- version: '0'
23
- type: :development
24
22
  prerelease: false
25
- version_requirements: *81909430
26
- - !ruby/object:Gem::Dependency
27
- name: autotest
28
- requirement: &81909190 !ruby/object:Gem::Requirement
23
+ requirement: &id001 !ruby/object:Gem::Requirement
29
24
  none: false
30
- requirements:
31
- - - ! '>='
32
- - !ruby/object:Gem::Version
33
- version: '0'
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 2
30
+ - 5
31
+ version: "2.5"
34
32
  type: :development
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: autotest
35
36
  prerelease: false
36
- version_requirements: *81909190
37
- - !ruby/object:Gem::Dependency
38
- name: autotest-notification
39
- requirement: &81908950 !ruby/object:Gem::Requirement
37
+ requirement: &id002 !ruby/object:Gem::Requirement
40
38
  none: false
41
- requirements:
42
- - - ! '>='
43
- - !ruby/object:Gem::Version
44
- version: '0'
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ segments:
43
+ - 0
44
+ version: "0"
45
45
  type: :development
46
+ version_requirements: *id002
47
+ - !ruby/object:Gem::Dependency
48
+ name: autotest-notification
46
49
  prerelease: false
47
- version_requirements: *81908950
48
- - !ruby/object:Gem::Dependency
49
- name: rspec
50
- requirement: &81908710 !ruby/object:Gem::Requirement
50
+ requirement: &id003 !ruby/object:Gem::Requirement
51
51
  none: false
52
- requirements:
53
- - - ~>
54
- - !ruby/object:Gem::Version
55
- version: '2.5'
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ segments:
56
+ - 0
57
+ version: "0"
56
58
  type: :development
57
- prerelease: false
58
- version_requirements: *81908710
59
+ version_requirements: *id003
59
60
  description: This is a DSL for creating more complicated command line tools.
60
- email:
61
+ email:
61
62
  - madeonamac@gmail.com
62
63
  executables: []
64
+
63
65
  extensions: []
64
- extra_rdoc_files:
65
- - LICENSE
66
- - README.markdown
67
- files:
68
- - CHANGELOG.md
66
+
67
+ extra_rdoc_files: []
68
+
69
+ files:
70
+ - TODO.md
69
71
  - Gemfile
72
+ - README.markdown
70
73
  - Gemfile.lock
74
+ - CHANGELOG.md
71
75
  - LICENSE
72
- - README.markdown
73
76
  - Rakefile
74
- - TODO.md
75
- - lib/VERSION.yml
76
77
  - lib/choosy.rb
78
+ - lib/VERSION.yml
79
+ - lib/choosy/errors.rb
80
+ - lib/choosy/printing.rb
81
+ - lib/choosy/converter.rb
82
+ - lib/choosy/parse_result.rb
83
+ - lib/choosy/verifier.rb
77
84
  - lib/choosy/argument.rb
78
- - lib/choosy/base_command.rb
85
+ - lib/choosy/version.rb
86
+ - lib/choosy/option.rb
79
87
  - lib/choosy/command.rb
80
- - lib/choosy/converter.rb
88
+ - lib/choosy/super_command.rb
81
89
  - lib/choosy/dsl/argument_builder.rb
90
+ - lib/choosy/dsl/super_command_builder.rb
82
91
  - lib/choosy/dsl/base_builder.rb
83
- - lib/choosy/dsl/base_command_builder.rb
84
92
  - lib/choosy/dsl/command_builder.rb
85
93
  - lib/choosy/dsl/option_builder.rb
86
- - lib/choosy/dsl/super_command_builder.rb
87
- - lib/choosy/errors.rb
88
- - lib/choosy/option.rb
89
- - lib/choosy/parse_result.rb
94
+ - lib/choosy/dsl/base_command_builder.rb
95
+ - lib/choosy/versiontask.rb
90
96
  - lib/choosy/parser.rb
91
- - lib/choosy/printing.rb
97
+ - lib/choosy/base_command.rb
98
+ - lib/choosy/printing/manpage_printer.rb
92
99
  - lib/choosy/printing/base_printer.rb
93
- - lib/choosy/printing/color.rb
94
- - lib/choosy/printing/erb_printer.rb
95
100
  - lib/choosy/printing/formatting_element.rb
96
- - lib/choosy/printing/help_printer.rb
97
101
  - lib/choosy/printing/manpage.rb
98
- - lib/choosy/printing/manpage_printer.rb
99
102
  - lib/choosy/printing/terminal.rb
100
- - lib/choosy/super_command.rb
103
+ - lib/choosy/printing/color.rb
104
+ - lib/choosy/printing/erb_printer.rb
105
+ - lib/choosy/printing/help_printer.rb
101
106
  - lib/choosy/super_parser.rb
102
- - lib/choosy/verifier.rb
103
- - lib/choosy/version.rb
107
+ - spec/integration/command-A_spec.rb
108
+ - spec/integration/supercommand-C_spec.rb
109
+ - spec/integration/command-B_spec.rb
110
+ - spec/integration/supercommand-B_spec.rb
111
+ - spec/integration/supercommand-A_spec.rb
112
+ - spec/integration/command-C_spec.rb
113
+ - spec/choosy/converter_spec.rb
114
+ - spec/choosy/option_spec.rb
115
+ - spec/choosy/version_spec.rb
104
116
  - spec/choosy/argument_spec.rb
105
117
  - spec/choosy/base_command_spec.rb
118
+ - spec/choosy/version.yml
106
119
  - spec/choosy/command_spec.rb
107
- - spec/choosy/converter_spec.rb
108
- - spec/choosy/dsl/argument_builder_spec.rb
120
+ - spec/choosy/dsl/super_command_builder_spec.rb
121
+ - spec/choosy/dsl/option_builder_spec.rb
109
122
  - spec/choosy/dsl/base_builder_spec.rb
110
- - spec/choosy/dsl/base_command_builder_spec.rb
123
+ - spec/choosy/dsl/argument_builder_spec.rb
111
124
  - spec/choosy/dsl/commmand_builder_spec.rb
112
- - spec/choosy/dsl/option_builder_spec.rb
113
- - spec/choosy/dsl/super_command_builder_spec.rb
114
- - spec/choosy/option_spec.rb
115
- - spec/choosy/parser_spec.rb
116
- - spec/choosy/printing/base_printer_spec.rb
117
- - spec/choosy/printing/color_spec.rb
118
- - spec/choosy/printing/help_printer_spec.rb
119
- - spec/choosy/printing/manpage_printer_spec.rb
120
- - spec/choosy/printing/manpage_spec.rb
121
- - spec/choosy/printing/terminal_spec.rb
125
+ - spec/choosy/dsl/base_command_builder_spec.rb
122
126
  - spec/choosy/super_command_spec.rb
123
127
  - spec/choosy/super_parser_spec.rb
124
128
  - spec/choosy/verifier_spec.rb
125
- - spec/choosy/version.yml
126
- - spec/choosy/version_spec.rb
127
- - spec/integration/command-A_spec.rb
128
- - spec/integration/command-B_spec.rb
129
- - spec/integration/command-C_spec.rb
130
- - spec/integration/supercommand-A_spec.rb
131
- - spec/integration/supercommand-B_spec.rb
132
- - spec/integration/supercommand-C_spec.rb
129
+ - spec/choosy/printing/help_printer_spec.rb
130
+ - spec/choosy/printing/terminal_spec.rb
131
+ - spec/choosy/printing/base_printer_spec.rb
132
+ - spec/choosy/printing/manpage_printer_spec.rb
133
+ - spec/choosy/printing/color_spec.rb
134
+ - spec/choosy/printing/manpage_spec.rb
135
+ - spec/choosy/parser_spec.rb
133
136
  - spec/spec_helpers.rb
134
- - examples/bar.rb
135
- - examples/foo.rb
136
- - examples/superfoo.rb
137
137
  has_rdoc: true
138
138
  homepage: http://github.com/gabemc/choosy
139
139
  licenses: []
140
+
140
141
  post_install_message:
141
142
  rdoc_options: []
142
- require_paths:
143
+
144
+ require_paths:
143
145
  - lib
144
- required_ruby_version: !ruby/object:Gem::Requirement
146
+ required_ruby_version: !ruby/object:Gem::Requirement
145
147
  none: false
146
- requirements:
147
- - - ! '>='
148
- - !ruby/object:Gem::Version
149
- version: '0'
150
- required_rubygems_version: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ segments:
152
+ - 0
153
+ version: "0"
154
+ required_rubygems_version: !ruby/object:Gem::Requirement
151
155
  none: false
152
- requirements:
153
- - - ! '>='
154
- - !ruby/object:Gem::Version
155
- version: '0'
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ segments:
160
+ - 1
161
+ - 3
162
+ - 6
163
+ version: 1.3.6
156
164
  requirements: []
165
+
157
166
  rubyforge_project:
158
- rubygems_version: 1.6.1
167
+ rubygems_version: 1.3.7
159
168
  signing_key:
160
169
  specification_version: 3
161
170
  summary: Yet another option parsing library.
162
- test_files:
163
- - examples/bar.rb
164
- - examples/foo.rb
165
- - examples/superfoo.rb
166
- - spec/choosy/argument_spec.rb
167
- - spec/choosy/base_command_spec.rb
168
- - spec/choosy/command_spec.rb
169
- - spec/choosy/converter_spec.rb
170
- - spec/choosy/dsl/argument_builder_spec.rb
171
- - spec/choosy/dsl/base_builder_spec.rb
172
- - spec/choosy/dsl/base_command_builder_spec.rb
173
- - spec/choosy/dsl/commmand_builder_spec.rb
174
- - spec/choosy/dsl/option_builder_spec.rb
175
- - spec/choosy/dsl/super_command_builder_spec.rb
176
- - spec/choosy/option_spec.rb
177
- - spec/choosy/parser_spec.rb
178
- - spec/choosy/printing/base_printer_spec.rb
179
- - spec/choosy/printing/color_spec.rb
180
- - spec/choosy/printing/help_printer_spec.rb
181
- - spec/choosy/printing/manpage_printer_spec.rb
182
- - spec/choosy/printing/manpage_spec.rb
183
- - spec/choosy/printing/terminal_spec.rb
184
- - spec/choosy/super_command_spec.rb
185
- - spec/choosy/super_parser_spec.rb
186
- - spec/choosy/verifier_spec.rb
187
- - spec/choosy/version_spec.rb
188
- - spec/integration/command-A_spec.rb
189
- - spec/integration/command-B_spec.rb
190
- - spec/integration/command-C_spec.rb
191
- - spec/integration/supercommand-A_spec.rb
192
- - spec/integration/supercommand-B_spec.rb
193
- - spec/integration/supercommand-C_spec.rb
194
- - spec/spec_helpers.rb
171
+ test_files: []
172
+
data/examples/bar.rb DELETED
@@ -1,46 +0,0 @@
1
- #!/usr/bin/env ruby
2
- ##-
3
- BEGIN {$VERBOSE = true}
4
- $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
5
- ##+
6
- # bar.rb
7
- require 'choosy'
8
-
9
- # Create a new command
10
- $bar_cmd = Choosy::Command.new :bar do
11
- executor do |args, options|
12
- if options[:bold]
13
- puts "BOLD!!!"
14
- else
15
- puts "plain"
16
- end
17
- end
18
-
19
- summary "Displays when this is a subcommand"
20
- para "Just prints 'bar'"
21
- para "A truly unremarkable command"
22
-
23
- header 'Option:'
24
- boolean :bold, "Bolds something" do
25
- negate 'un'
26
- end
27
-
28
- # Because there is no bar.arguments call,
29
- # it is now an error if there are extra
30
- # command line arguments to this command.
31
- end
32
-
33
- if __FILE__ == $0
34
- args = ['--un-bold']
35
-
36
- result = $bar_cmd.parse!(args)
37
-
38
- require 'pp'
39
- pp result.options[:bold] # => false
40
- pp result.args # => []
41
-
42
- $bar_cmd.execute!(args) # => 'plain'
43
-
44
- args << 'should-throw-error'
45
- $bar_cmd.execute!(args)
46
- end
data/examples/foo.rb DELETED
@@ -1,200 +0,0 @@
1
- #!/usr/bin/env ruby
2
- ##-
3
- BEGIN {$VERBOSE = true}
4
- $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
5
- ##+
6
- # foo.rb
7
- require 'choosy'
8
-
9
- FOO_VERSION = '1.0.1'
10
-
11
- class FooExecutor
12
- def execute!(args, options)
13
- puts "BOLDED!!" if options[:bold]
14
- options[:count].times do
15
- puts "#{options[:prefix]}#{options[:words].push('foo').join(',')}#{options[:suffix]}"
16
- end
17
- puts "and #{args.join ' '}"
18
- end
19
- end
20
-
21
- $foo_cmd = Choosy::Command.new :foo do |foo|
22
- # Add a class to do the execution when you call foo_cmd.execute!
23
- # You can also use a proc that takes the options and the args, like:
24
- # executor { |args, options| puts 'Hi!' }
25
- executor FooExecutor.new
26
-
27
- # When used as a subcommand, you need a summary for the help screen
28
- summary "This is a nice command named 'foo'"
29
-
30
- # You can add your custom printer by giving the
31
- # full path to an ERB template file here.
32
- # The default printer is :standard, but you can
33
- # also use the builtin printer :erb, with the :tempates
34
- # parameter to set the erb template you wish to use. The
35
- # output can be colored or uncolored, though the
36
- # default is colored.
37
- printer :standard, :color => true, :header_styles => [:bold, :green]
38
-
39
- para 'Prints out "foo" to the console'
40
- para 'This is a long description of what foo is an how it works. This line will assuredly wrap the console at least once, since it it such a long line, but it will be wrapped automatically by the printer, above. If you want to, you can add write "printer :standard, :max_width => 80" to set the maximum column width that the printer will allow (not respected by ERB templates).'
41
-
42
- header 'Required Options:' # Formatted according to the header_styles for the printer
43
-
44
- # A shorthand for a common option type.
45
- # It adds the '-p/--prefix PREFIX' infomation for you.
46
- single :prefix, "A prefix for 'foo'" do
47
- default '<'
48
- required
49
- end
50
-
51
- # The long way to do the same thing as above, except with
52
- # explicitly named dependencies
53
- option :suffix => [:prefix] do
54
- short '-s'
55
- long '--suffix', 'SUFFIX'
56
- desc 'A suffix for "foo"'
57
- required
58
-
59
- validate do |suffix, options|
60
- if suffix == options[:prefix]
61
- die "You can't matching prefixes and suffixes, you heathen!"
62
- end
63
- end
64
- end
65
-
66
- # Just like the 'single' method above, except now it automatically
67
- # requires/casts the argument to this flag into an integer. These commands
68
- # also take an optional hash as the last argument, which can be used instead
69
- # of a block.
70
- integer :count, 'The number of times to repeat "foo"', :required => true
71
-
72
- header 'Options:', :bold, :blue # Format this header differently, overrides 'header_styles'
73
-
74
- option :words do
75
- short '-w'
76
- long '--words', 'WORDS+' # By default, the '+' at the end
77
- # means that this takes multiple
78
- # arguments. You put a '-' at
79
- # the end of the argument list
80
- # to stop parsing this option
81
- # and allow for regular args.
82
- desc "Other fun words to put in quotes"
83
-
84
- # Sets the exact count of the number of arguments it accepts.
85
- # also allowable are the single selectors :zero and :one.
86
- # By default, the option 'WORDS+' sets the range to be
87
- # {:at_least => 1, :at_most => 1000 }
88
- count :at_least => 2, :at_most => 10
89
-
90
- validate do |words, options|
91
- words.each do |word|
92
- if word !~ /\w+/
93
- die "I can't print that: #{word}"
94
- end
95
- end
96
- end
97
- end
98
-
99
- # Alternatively, we could have done the following:
100
- strings :words, "Other fun words to put in quotes" do
101
- count 2..10
102
- default []
103
- validate do |words, options|
104
- words.each do |word|
105
- if word !~ /\w+/
106
- die "I can't print that: #{word}"
107
- end
108
- end
109
- end
110
- end
111
-
112
- # Yet another shorthand notation for options, since they
113
- # are boolean by default. Here, we add a negation to the
114
- # long flag of the option, creating [-b|--bold|--un-bold] flags.
115
- # By default, calling 'negate' in a block without an argument
116
- # uses the '--no-' prefix instead.
117
- boolean :bold, "Bold this option", :default => false, :negate => 'un'
118
-
119
- # Tail options
120
-
121
- # When any of the simpler notations are suffixed with a '_'
122
- # character, the short option is always suppressed.
123
- boolean_ :debug, "Prints out extra debugging output."
124
-
125
- # The '_' characters are replaced with '-' in flags, so the
126
- # following creates a '--[no-]color' flag.
127
- boolean_ :color, "Turns on/off coloring in the output. Defalt is on." do
128
- negate
129
- default true
130
- validate do
131
- foo.entity.alter do
132
- printer :standard, :colored => false
133
- end
134
- end
135
- end
136
-
137
- # Adds the standard -h/--help option.
138
- # Should skip the '-h' flag if already set.
139
- help # Automatically adds the description if not passed an argument. You can supply your own
140
-
141
- # Adds the --version option.
142
- version "Foo: #{FOO_VERSION}"
143
-
144
- # Now, add some validation for any addtional arguments
145
- # that are left over after the parsing the options.
146
- arguments do
147
- metaname 'ARGS'
148
- count 1..10
149
- validate do |args, options|
150
- if args.empty?
151
- die "You have to pass in empty arguments that do nothing!"
152
- end
153
- if args.count == 10
154
- die "Whoa there! You're going argument crazy!"
155
- end
156
- end
157
- end
158
- end
159
-
160
- if __FILE__ == $0
161
- # Parses and validates the options.
162
- args = ['--prefix', '{',
163
- '--suffix', '}',
164
- '--words', 'high', 'there', 'you', '-',
165
- # The '-' stops parsing this option, so that:
166
- 'handsom', 'devil',
167
- 'http://not.posting.here', # will be regular arguments
168
- '-c', '3', # Count
169
- '--', # Stops parsing all arguments
170
- '-h', '--help', '-v', '--version' # Ignored
171
- ]
172
- result = $foo_cmd.parse!(args)
173
-
174
- require 'pp'
175
- pp result[:prefix] # => '{'
176
- pp result[:suffix] # => '}'
177
- pp result[:count] # => 3
178
- pp result[:bold] # => false
179
- pp result[:words] # => ['high', 'there', 'you']
180
- pp result.args # => ['handsom', 'devil',
181
- # 'http://not.posting.here',
182
- # '-h', '--help', '-v', '--version']
183
- pp result.options # => {:prefix => '{', :suffix => '}'
184
- # :count => 3, :bold => false,
185
- # :words => ['high', 'there', 'you'],
186
- # :debug => false, :color => true}
187
-
188
- # Now, call the command that does the actual work.
189
- # This passes the foo_cmd.options and the foo_cmd.args
190
- # as arguments to the executors 'execute!' method.
191
- #
192
- # This allows you to easily associate command classes with
193
- # commands, without resorting to a hash or combining
194
- # execution logic with command parsing logic.
195
- $foo_cmd.execute!(args) # {high,there,you,foo}
196
- # {high,there,you,foo}
197
- # {high,there,you,foo}
198
- # and handsom devil http://not.posting.here -h --help -v --verbose
199
-
200
- end
data/examples/superfoo.rb DELETED
@@ -1,137 +0,0 @@
1
- #!/usr/bin/env ruby
2
- ##-
3
- BEGIN {$VERBOSE = true}
4
- $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
5
- $LOAD_PATH.unshift File.dirname(__FILE__)
6
- ##+
7
-
8
- # superfoo.rb
9
- require 'choosy'
10
- require 'foo'
11
- require 'bar'
12
-
13
- SUPERFOO_VERSION = "1.0.1"
14
-
15
- superfoo = Choosy::SuperCommand.new :superfoo do
16
- summary "This is a superfoo command"
17
- para "Say something, dammit!"
18
-
19
- # You can also add commands after instantiation.
20
- # Note that, when added, these commands have their
21
- # -h/--help/--version flags suppressed, so you'll
22
- # need to add those flags here.
23
- command $bar_cmd
24
- command $foo_cmd
25
-
26
- # Creates a 'help' command, message optional
27
- help "Prints this help message"
28
-
29
- # Create some global options that are parsed
30
- # defore result options
31
-
32
- # Here, check that a YAML file exists, and attempt
33
- # to load it's parsed contents into this option.
34
- # There is also a 'file' type that checks to see
35
- # if the file exists. With both 'file' and 'yaml',
36
- # if the file is missing, the option fails with an
37
- # error.
38
- yaml :Config, "Configure your superfoo with a YAML configuration file." do
39
- default File.join(ENV['HOME'], '.superfoo.yml')
40
- end
41
-
42
- # Adds a global --version flag.
43
- version "#{SUPERFOO_VERSION}"
44
- end
45
-
46
- if __FILE__ == $0
47
- args = ['foo',
48
- '-c', '5',
49
- '--config', 'superfoo.yaml',
50
- '--prefix', '{',
51
- '--suffix', '}',
52
- 'cruft',
53
- 'bar',
54
- '--bold']
55
-
56
- result = superfoo.parse!(args)
57
-
58
- require 'pp'
59
- pp result[:Config] # => {:here => 'text'} # Pulled the config!
60
-
61
- foores = result.subresults[0]
62
-
63
- pp foores[:Config] # => {:here => 'text'} # Passed along!
64
- pp foores[:prefix] # => '{'
65
- pp foores[:suffix] # => '}'
66
- pp foores[:count] # => 5
67
- pp foores[:bold] # => true
68
- pp foores.options # => {:prefix => '{', :suffix => '}'
69
- # :count => 5,
70
- # :bold => true,
71
- # :words => [],
72
- # :config => '~/.superfoo' }
73
- pp foores.args # => ['cruft', 'bar']
74
-
75
- # Now, we can call the result
76
- superfoo.execute!(args) ## Calls superfoo.result.execute!
77
- ## Prints:
78
- # BOLDED!!
79
- # {foo}
80
- # {foo,foo}
81
- # {foo,foo,foo}
82
- # {foo,foo,foo,foo}
83
- # {foo,foo,foo,foo,foo}
84
- # and cruft bar
85
-
86
- # Instead of parsing the 'bar' parameter as an argument to
87
- # the foo command, so that when the first argument that matches
88
- # another command name is encountered, it stops parsing the
89
- # current command and passes the rest of the arguments to the
90
- # next command.
91
- #
92
- # In this case, we call the 'alter' method to use the DSL
93
- # syntax again to alter this command.
94
- #
95
- # You can also set this inside a SuperChoosy.new {...}
96
- # block.
97
- superfoo.alter do
98
- parsimonious
99
- end
100
-
101
- result = superfoo.parse!(args)
102
-
103
- foores = result.subresults[0]
104
- pp foores[:Config] # => {:here => 'text'} # Passed along!
105
- pp foores.command.name # => :foo
106
- pp foores[:prefix] # => '{'
107
- pp foores[:suffix] # => '}'
108
- pp foores[:count] # => 5
109
- pp foores[:bold] # => true
110
- pp foores.options # => {:prefix => '{', :suffix => '}'
111
- # :count => 5,
112
- # :bold => false,
113
- # :words => [],
114
- # :config => {:here => 'text'}
115
- # }
116
- pp foores.args # => ['cruft']
117
-
118
- barres = result.subresults[1]
119
- pp barres.command.name # => :bar
120
- pp barres[:bold] # => true
121
- pp barres.options # => {:bold => true,
122
- # :config => {:here => 'text'}
123
- # }
124
- pp barres.args # => []
125
-
126
- # Now, execute the results in order
127
- superfoo.execute!(args) ## Same as:
128
- # results.each do |subcommand|
129
- # command.execute!
130
- # end
131
- ## Prints:
132
- # {foo}
133
- # {foo}
134
- # and cruft
135
- # BOLDED BAR
136
- end
137
-