bales 0.0.5 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 17c462972479f90f386f6ea8b6e5f710ae18262e
4
- data.tar.gz: 72374a11afb564934358320e62eb0e69176b3847
3
+ metadata.gz: 4301c3b933852b3c9cd2f1e66b2adc6c31fa5e7f
4
+ data.tar.gz: 41e05ffb0f56874d16f38508d038d337a507a0b1
5
5
  SHA512:
6
- metadata.gz: 44a588c1e833245146d6366abd2e12736bbb019d0ee771833eac545c74a5cca79f75f5ed9e5fbf55a3ccf4827ecd45db71357ed11ba59a35e638dd6db7f33c87
7
- data.tar.gz: e54a24cbc39f4a8248a339bf25c5b5cc11e330190887b6adf7d87fc8bc5d47a6b59b78625d91d004e2b6904018325fd3724ea0f116c5393e6da6bb0049804e4b
6
+ metadata.gz: dbfbacab09a7b0b517f23703fa811106091625006a1e273447a7814464c99702a85c3611442a78b219f3ec81c3ed2287aaca545a079bc2c5660f198592b4f1d5
7
+ data.tar.gz: 402eb19431e501717fdd54a9202ba898d0865379dda6f689b7609e56ee0f806b34f58d36fdafd5c2b6e6fcbca3c213e99a2ac5e9fc70188f516803dd83f11cea
@@ -130,21 +130,15 @@ module Bales
130
130
  command ||= default_command
131
131
  opts, args = command.parse_opts result
132
132
  return command, args, opts
133
- end
134
-
135
- ##
136
- # Parses ARGV (or some other array if you specify one) for a
137
- # command to run and its arguments/options, then runs the command.
138
- def self.parse_and_run(argv=ARGV)
139
- command, args, opts = parse argv
140
- run command, *args, **opts
141
133
  rescue OptionParser::MissingArgument
142
134
  flag = $!.message.gsub("missing argument: ", '')
143
135
  puts "#{$0}: error: option needs an argument (#{flag})"
136
+ puts "Usage: #{command.usage}"
144
137
  exit!
145
138
  rescue OptionParser::InvalidOption
146
139
  flag = $!.message.gsub("invalid option: ", '')
147
140
  puts "#{$0}: error: unknown option (#{flag})"
141
+ puts "Usage: #{command.usage}"
148
142
  exit!
149
143
  rescue ArgumentError
150
144
  raise unless $!.message.match(/wrong number of arguments/)
@@ -154,9 +148,18 @@ module Bales
154
148
  .gsub(")", '')
155
149
  .split(" for ")
156
150
  puts "#{$0}: error: expected #{expected} args but got #{received}"
151
+ puts "Usage: #{command.usage}"
157
152
  exit!
158
153
  end
159
154
 
155
+ ##
156
+ # Parses ARGV (or some other array if you specify one) for a
157
+ # command to run and its arguments/options, then runs the command.
158
+ def self.parse_and_run(argv=ARGV)
159
+ command, args, opts = parse argv
160
+ run command, *args, **opts
161
+ end
162
+
160
163
  private
161
164
 
162
165
  def self.parse_command_name(argv)
@@ -13,6 +13,7 @@ class Bales::Command::Help < Bales::Command
13
13
  target = basename
14
14
  end
15
15
 
16
+ print_usage(target)
16
17
  print_summary(target)
17
18
  print_options(target)
18
19
  print_commands(target)
@@ -109,6 +110,10 @@ class Bales::Command::Help < Bales::Command
109
110
  print "Description:\n#{command.description}\n\n"
110
111
  end
111
112
 
113
+ def self.print_usage(command)
114
+ print "Usage: #{command.usage}\n\n"
115
+ end
116
+
112
117
  def self.print_commands(namespace)
113
118
  cmds = commands(namespace)
114
119
 
data/lib/bales/command.rb CHANGED
@@ -93,6 +93,60 @@ module Bales
93
93
  end
94
94
  end
95
95
 
96
+ ##
97
+ # Translates the command's class name to a more complete name
98
+ # passed on the command line, including the subcommand, all
99
+ # commands leading to it, and the root command.
100
+ def self.full_name
101
+ parts = self
102
+ .name
103
+ .split('::')
104
+ .map { |p| p.gsub(/(.)([A-Z])/, '\1-\2').downcase }
105
+ parts = parts[2..-1].join(' ')
106
+ "#{$0} #{parts}"
107
+ end
108
+
109
+ ##
110
+ # Print the command's usage statement.
111
+ def self.usage
112
+ usage = []
113
+
114
+ # Name
115
+ usage << full_name
116
+
117
+ # Arguments
118
+ method(:run).parameters.each do |type, name|
119
+ # We don't handle keys and keyrests, since they're going to be
120
+ # taken care of once we start dealing with options.
121
+ case type
122
+ when :req then usage << "<#{name}>"
123
+ when :opt then usage << "[<#{name}>]"
124
+ when :rest then usage << "[<#{name}> ...]"
125
+ end
126
+ end
127
+
128
+ # Options
129
+ options.each_pair do |opt, args|
130
+ case
131
+ when (args[:type] <= TrueClass or args[:type] <= FalseClass)
132
+ if args.key?(:short_form)
133
+ usage << "[(#{args[:long_form]}|#{args[:short_form]})]"
134
+ else
135
+ usage << "[#{args[:long_form]}]"
136
+ end
137
+ else
138
+ if args.key?(:short_form)
139
+ usage << "[(#{args[:long_form]}|#{args[:short_form]}) " \
140
+ "<#{args[:arg]}>]"
141
+ else
142
+ usage << "[#{args[:long_form]} <#{args[:arg]}>]"
143
+ end
144
+ end
145
+ end
146
+
147
+ usage.join(' ')
148
+ end
149
+
96
150
  ##
97
151
  # Creates a new subcommand of the current command. Identical in
98
152
  # usage to +Bales::Application.command+, the only significant
data/lib/bales/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Bales
2
- VERSION="0.0.5"
2
+ VERSION="0.1.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bales
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan S. Northrup
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-17 00:00:00.000000000 Z
11
+ date: 2015-08-18 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A framework for building command-line applications
14
14
  email: