bbcloud 0.11.2 → 0.12.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.
- data/.gitignore +3 -2
- data/Gemfile +3 -0
- data/README +11 -1
- data/README.rdoc +11 -1
- data/Rakefile +12 -0
- data/bbcloud.gemspec +10 -10
- data/bin/brightbox-accounts +7 -2
- data/bin/brightbox-cloudips +7 -2
- data/bin/brightbox-config +7 -2
- data/bin/brightbox-images +7 -2
- data/bin/brightbox-lbs +7 -2
- data/bin/brightbox-servers +7 -2
- data/bin/brightbox-types +7 -2
- data/bin/brightbox-users +7 -2
- data/bin/brightbox-zones +7 -2
- data/lib/bbcloud.rb +43 -0
- data/lib/bbcloud/accounts.rb +5 -3
- data/lib/bbcloud/command_generator.rb +50 -0
- data/lib/bbcloud/commands/accounts-list.rb +13 -11
- data/lib/bbcloud/commands/accounts-reset-ftp-password.rb +26 -23
- data/lib/bbcloud/commands/accounts-show.rb +20 -16
- data/lib/bbcloud/commands/cloudips-create.rb +16 -14
- data/lib/bbcloud/commands/cloudips-destroy.rb +29 -26
- data/lib/bbcloud/commands/cloudips-list.rb +13 -11
- data/lib/bbcloud/commands/cloudips-map.rb +48 -46
- data/lib/bbcloud/commands/cloudips-show.rb +15 -12
- data/lib/bbcloud/commands/cloudips-unmap.rb +28 -25
- data/lib/bbcloud/commands/config-client-add.rb +33 -31
- data/lib/bbcloud/commands/config-client-default.rb +18 -16
- data/lib/bbcloud/commands/config-client-list.rb +19 -16
- data/lib/bbcloud/commands/config-client-remove.rb +18 -16
- data/lib/bbcloud/commands/images-destroy.rb +18 -16
- data/lib/bbcloud/commands/images-list.rb +20 -18
- data/lib/bbcloud/commands/images-register.rb +21 -19
- data/lib/bbcloud/commands/images-show.rb +17 -15
- data/lib/bbcloud/commands/lbs-add-nodes.rb +15 -13
- data/lib/bbcloud/commands/lbs-create.rb +65 -63
- data/lib/bbcloud/commands/lbs-destroy.rb +13 -11
- data/lib/bbcloud/commands/lbs-list.rb +13 -11
- data/lib/bbcloud/commands/lbs-remove-nodes.rb +15 -13
- data/lib/bbcloud/commands/lbs-show.rb +15 -13
- data/lib/bbcloud/commands/lbs-update.rb +59 -57
- data/lib/bbcloud/commands/servers-activate-cloud.rb +18 -16
- data/lib/bbcloud/commands/servers-create.rb +80 -77
- data/lib/bbcloud/commands/servers-destroy.rb +17 -15
- data/lib/bbcloud/commands/servers-list.rb +14 -14
- data/lib/bbcloud/commands/servers-show.rb +39 -37
- data/lib/bbcloud/commands/servers-shutdown.rb +14 -12
- data/lib/bbcloud/commands/servers-snapshot.rb +14 -12
- data/lib/bbcloud/commands/servers-start.rb +15 -13
- data/lib/bbcloud/commands/servers-stop.rb +14 -12
- data/lib/bbcloud/commands/types-list.rb +13 -11
- data/lib/bbcloud/commands/types-show.rb +18 -16
- data/lib/bbcloud/commands/users-list.rb +13 -11
- data/lib/bbcloud/commands/users-show.rb +17 -15
- data/lib/bbcloud/commands/users-update.rb +27 -25
- data/lib/bbcloud/commands/zones-list.rb +13 -11
- data/lib/bbcloud/config.rb +125 -111
- data/lib/bbcloud/error_parser.rb +34 -0
- data/lib/bbcloud/fog_extensions.rb +19 -0
- data/lib/bbcloud/gli_global_hooks.rb +56 -0
- data/lib/bbcloud/logging.rb +40 -0
- data/lib/bbcloud/ruby_core_ext.rb +9 -0
- data/lib/bbcloud/servers.rb +7 -2
- data/lib/bbcloud/tables.rb +78 -73
- data/lib/bbcloud/vendor/gli/.gitignore +10 -0
- data/lib/bbcloud/vendor/gli/.rvmrc +1 -0
- data/lib/bbcloud/vendor/gli/Gemfile +5 -0
- data/lib/bbcloud/vendor/gli/LICENSE.txt +201 -0
- data/lib/bbcloud/vendor/gli/README.rdoc +54 -0
- data/lib/bbcloud/vendor/gli/Rakefile +84 -0
- data/lib/bbcloud/vendor/gli/bin/gli +72 -0
- data/lib/bbcloud/vendor/gli/bin/report_on_rake_results +10 -0
- data/lib/bbcloud/vendor/gli/bin/test_all_rubies.sh +2 -0
- data/lib/bbcloud/vendor/gli/features/gli_executable.feature +88 -0
- data/lib/bbcloud/vendor/gli/features/gli_init.feature +122 -0
- data/lib/bbcloud/vendor/gli/features/step_definitions/gli_executable_steps.rb +12 -0
- data/lib/bbcloud/vendor/gli/features/step_definitions/gli_init_steps.rb +4 -0
- data/lib/bbcloud/vendor/gli/features/support/env.rb +21 -0
- data/lib/bbcloud/vendor/gli/gli.cheat +80 -0
- data/lib/bbcloud/vendor/gli/gli.gemspec +46 -0
- data/lib/bbcloud/vendor/gli/gli.rdoc +51 -0
- data/lib/bbcloud/vendor/gli/lib/gli.rb +560 -0
- data/lib/bbcloud/vendor/gli/lib/gli/command.rb +124 -0
- data/lib/bbcloud/vendor/gli/lib/gli/command_line_token.rb +58 -0
- data/lib/bbcloud/vendor/gli/lib/gli/copy_options_to_aliases.rb +33 -0
- data/lib/bbcloud/vendor/gli/lib/gli/exceptions.rb +45 -0
- data/lib/bbcloud/vendor/gli/lib/gli/flag.rb +67 -0
- data/lib/bbcloud/vendor/gli/lib/gli/options.rb +19 -0
- data/lib/bbcloud/vendor/gli/lib/gli/switch.rb +63 -0
- data/lib/bbcloud/vendor/gli/lib/gli/terminal.rb +79 -0
- data/lib/bbcloud/vendor/gli/lib/gli_version.rb +3 -0
- data/lib/bbcloud/vendor/gli/lib/support/help.rb +180 -0
- data/lib/bbcloud/vendor/gli/lib/support/initconfig.rb +34 -0
- data/lib/bbcloud/vendor/gli/lib/support/rdoc.rb +119 -0
- data/lib/bbcloud/vendor/gli/lib/support/scaffold.rb +284 -0
- data/lib/bbcloud/vendor/gli/test/config.yaml +9 -0
- data/lib/bbcloud/vendor/gli/test/gli.reek +116 -0
- data/lib/bbcloud/vendor/gli/test/roodi.yaml +9 -0
- data/lib/bbcloud/vendor/gli/test/tc_command.rb +329 -0
- data/lib/bbcloud/vendor/gli/test/tc_flag.rb +67 -0
- data/lib/bbcloud/vendor/gli/test/tc_gli.rb +429 -0
- data/lib/bbcloud/vendor/gli/test/tc_options.rb +31 -0
- data/lib/bbcloud/vendor/gli/test/tc_parsing.rb +279 -0
- data/lib/bbcloud/vendor/gli/test/tc_switch.rb +80 -0
- data/lib/bbcloud/vendor/gli/test/tc_terminal.rb +91 -0
- data/lib/bbcloud/version.rb +1 -1
- data/pkg/bbcloud-0.12.0.gem +0 -0
- data/spec/fixtures/vcr_cassettes/server_list.yml +117 -0
- data/spec/servers_spec.rb +36 -0
- data/spec/spec_helper.rb +24 -0
- data/spec/support/common_helpers.rb +47 -0
- metadata +129 -135
- data/lib/bbcloud/cli.rb +0 -160
- data/lib/bbcloud/vendor/fog/lib/fog.rb +0 -14
- data/lib/bbcloud/vendor/fog/lib/fog/compute.rb +0 -43
- data/lib/bbcloud/vendor/fog/lib/fog/compute/brightbox.rb +0 -162
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/account.rb +0 -51
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/cloud_ip.rb +0 -47
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/cloud_ips.rb +0 -34
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/flavor.rb +0 -33
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/flavors.rb +0 -28
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/image.rb +0 -56
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/images.rb +0 -28
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/load_balancer.rb +0 -50
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/load_balancers.rb +0 -28
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/server.rb +0 -108
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/servers.rb +0 -29
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/user.rb +0 -39
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/users.rb +0 -29
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/zone.rb +0 -21
- data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/zones.rb +0 -29
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/activate_console_server.rb +0 -20
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/add_listeners_load_balancer.rb +0 -20
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/add_nodes_load_balancer.rb +0 -20
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/create_api_client.rb +0 -19
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/create_cloud_ip.rb +0 -19
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/create_image.rb +0 -19
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/create_load_balancer.rb +0 -19
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/create_server.rb +0 -19
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/destroy_api_client.rb +0 -20
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/destroy_cloud_ip.rb +0 -20
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/destroy_image.rb +0 -20
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/destroy_load_balancer.rb +0 -20
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/destroy_server.rb +0 -20
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_account.rb +0 -19
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_api_client.rb +0 -20
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_cloud_ip.rb +0 -20
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_image.rb +0 -20
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_interface.rb +0 -20
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_load_balancer.rb +0 -20
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_server.rb +0 -20
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_server_type.rb +0 -20
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_user.rb +0 -20
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_zone.rb +0 -20
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/list_api_clients.rb +0 -19
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/list_cloud_ips.rb +0 -19
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/list_images.rb +0 -19
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/list_load_balancers.rb +0 -19
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/list_server_types.rb +0 -19
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/list_servers.rb +0 -19
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/list_users.rb +0 -19
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/list_zones.rb +0 -19
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/map_cloud_ip.rb +0 -20
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/remove_listeners_load_balancer.rb +0 -20
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/remove_nodes_load_balancer.rb +0 -20
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/reset_ftp_password_account.rb +0 -19
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/resize_server.rb +0 -19
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/shutdown_server.rb +0 -20
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/snapshot_server.rb +0 -20
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/start_server.rb +0 -20
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/stop_server.rb +0 -20
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/unmap_cloud_ip.rb +0 -20
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/update_account.rb +0 -20
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/update_api_client.rb +0 -21
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/update_image.rb +0 -21
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/update_load_balancer.rb +0 -21
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/update_server.rb +0 -21
- data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/update_user.rb +0 -21
- data/lib/bbcloud/vendor/fog/lib/fog/core.rb +0 -32
- data/lib/bbcloud/vendor/fog/lib/fog/core/attributes.rb +0 -178
- data/lib/bbcloud/vendor/fog/lib/fog/core/collection.rb +0 -127
- data/lib/bbcloud/vendor/fog/lib/fog/core/connection.rb +0 -35
- data/lib/bbcloud/vendor/fog/lib/fog/core/credentials.rb +0 -92
- data/lib/bbcloud/vendor/fog/lib/fog/core/deprecation.rb +0 -23
- data/lib/bbcloud/vendor/fog/lib/fog/core/errors.rb +0 -20
- data/lib/bbcloud/vendor/fog/lib/fog/core/hmac.rb +0 -48
- data/lib/bbcloud/vendor/fog/lib/fog/core/mock.rb +0 -68
- data/lib/bbcloud/vendor/fog/lib/fog/core/model.rb +0 -57
- data/lib/bbcloud/vendor/fog/lib/fog/core/parser.rb +0 -99
- data/lib/bbcloud/vendor/fog/lib/fog/core/provider.rb +0 -18
- data/lib/bbcloud/vendor/fog/lib/fog/core/scp.rb +0 -67
- data/lib/bbcloud/vendor/fog/lib/fog/core/service.rb +0 -175
- data/lib/bbcloud/vendor/fog/lib/fog/core/ssh.rb +0 -120
- data/lib/bbcloud/vendor/fog/lib/fog/core/time.rb +0 -27
- data/lib/bbcloud/vendor/fog/lib/fog/core/wait_for.rb +0 -17
- data/lib/bbcloud/vendor/fog/lib/fog/providers.rb +0 -9
- data/lib/bbcloud/vendor/fog/lib/fog/providers/brightbox.rb +0 -9
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
require 'gli/command_line_token.rb'
|
|
2
|
+
require 'gli/copy_options_to_aliases.rb'
|
|
3
|
+
|
|
4
|
+
module GLI
|
|
5
|
+
# A command to be run, in context of global flags and switches. You are given an instance of this class
|
|
6
|
+
# to the block you use for GLI#command. You then use the methods described here to describe the
|
|
7
|
+
# command-specific command-line arguments, much as you use the methods in GLI to describe the global
|
|
8
|
+
# command-line interface
|
|
9
|
+
class Command < CommandLineToken
|
|
10
|
+
include CopyOptionsToAliases
|
|
11
|
+
|
|
12
|
+
# Create a new command
|
|
13
|
+
#
|
|
14
|
+
# +names+:: A String, Symbol, or Array of String or Symbol that represents the name(s) of this command.
|
|
15
|
+
# +description+:: short description of this command as a Strign
|
|
16
|
+
# +arguments_name+:: description of the arguments as a String, or nil if this command doesn't take arguments
|
|
17
|
+
# +long_desc+:: a longer description of the command, possibly with multiple lines and text formatting
|
|
18
|
+
# +skips_pre+:: if true, this command advertises that it doesn't want the pre block called first
|
|
19
|
+
# +skips_post+:: if true, this command advertises that it doesn't want the post block called after it
|
|
20
|
+
def initialize(names,description,arguments_name=nil,long_desc=nil,skips_pre=false,skips_post=false) # :nodoc:
|
|
21
|
+
super(names,description,long_desc)
|
|
22
|
+
@arguments_description = arguments_name || ''
|
|
23
|
+
@skips_pre = skips_pre
|
|
24
|
+
@skips_post = skips_post
|
|
25
|
+
clear_nexts
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Return the arguments description
|
|
29
|
+
def arguments_description #:nodoc:
|
|
30
|
+
@arguments_description
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# If true, this command doesn't want the pre block run before it executes
|
|
34
|
+
def skips_pre #:nodoc:
|
|
35
|
+
@skips_pre
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# If true, this command doesn't want the post block run before it executes
|
|
39
|
+
def skips_post #:nodoc:
|
|
40
|
+
@skips_post
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Return the Array of the command's names
|
|
44
|
+
def names #:nodoc:
|
|
45
|
+
all_forms
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Get the usage string
|
|
49
|
+
# CR: This should probably not be here
|
|
50
|
+
def usage #:nodoc:
|
|
51
|
+
usage = name.to_s
|
|
52
|
+
usage += ' [command options]' if !flags.empty? || !switches.empty?
|
|
53
|
+
usage += ' ' + @arguments_description if @arguments_description
|
|
54
|
+
usage
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Return the flags as a Hash
|
|
58
|
+
def flags #:nodoc:
|
|
59
|
+
@flags ||= {}
|
|
60
|
+
end
|
|
61
|
+
# Return the switches as a Hash
|
|
62
|
+
def switches #:nodoc:
|
|
63
|
+
@switches ||= {}
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# describe the next switch or flag just as GLI#desc does.
|
|
67
|
+
def desc(description); @next_desc = description; end
|
|
68
|
+
# set the long description of this flag/switch, just as GLI#long_desc does.
|
|
69
|
+
def long_desc(long_desc); @next_long_desc = long_desc; end
|
|
70
|
+
# describe the argument name of the next flag, just as GLI#arg_name does.
|
|
71
|
+
def arg_name(name); @next_arg_name = name; end
|
|
72
|
+
# set the default value of the next flag, just as GLI#default_value does.
|
|
73
|
+
def default_value(val); @next_default_value = val; end
|
|
74
|
+
|
|
75
|
+
# Create a command-specific flag, similar to GLI#flag
|
|
76
|
+
def flag(*names)
|
|
77
|
+
names = [names].flatten
|
|
78
|
+
GLI.verify_unused(names,flags,switches,"in command #{name}")
|
|
79
|
+
flag = Flag.new(names,@next_desc,@next_arg_name,@next_default_value,@next_long_desc)
|
|
80
|
+
flags[flag.name] = flag
|
|
81
|
+
clear_nexts
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Create a command-specific switch, similar to GLI#switch
|
|
85
|
+
def switch(*names)
|
|
86
|
+
names = [names].flatten
|
|
87
|
+
GLI.verify_unused(names,flags,switches,"in command #{name}")
|
|
88
|
+
switch = Switch.new(names,@next_desc,@next_long_desc)
|
|
89
|
+
switches[switch.name] = switch
|
|
90
|
+
clear_nexts
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# Define the action to take when the user executes this command
|
|
94
|
+
#
|
|
95
|
+
# +block+:: A block of code to execute. The block will be given 3 arguments:
|
|
96
|
+
# +global_options+:: A Hash (or Options, see GLI#use_openstruct) of the _global_ options specified
|
|
97
|
+
# by the user, with defaults set and config file values used (if using a config file, see
|
|
98
|
+
# GLI#config_file)
|
|
99
|
+
# +options+:: A Hash (or Options, see GLI#use_openstruct) of the command-specific options specified by the
|
|
100
|
+
# user, with defaults set and config file values used (if using a config file, see GLI#config_file)
|
|
101
|
+
# +arguments+:: An Array of Strings representing the unparsed command line arguments
|
|
102
|
+
# The block's result value is not used; raise an exception or use GLI#exit_now! if you need an early exit based
|
|
103
|
+
# on an error condition
|
|
104
|
+
def action(&block)
|
|
105
|
+
@action = block
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def self.name_as_string(name) #:nodoc:
|
|
109
|
+
name.to_s
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def clear_nexts #:nodoc:
|
|
113
|
+
@next_desc = nil
|
|
114
|
+
@next_arg_name = nil
|
|
115
|
+
@next_default_value = nil
|
|
116
|
+
@next_long_desc = nil
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# Executes the command
|
|
120
|
+
def execute(global_options,options,arguments) #:nodoc:
|
|
121
|
+
@action.call(global_options,options,arguments)
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
module GLI
|
|
2
|
+
# Abstract base class for a logical element of a command line, mostly so that subclasses can have similar
|
|
3
|
+
# initialization and interface
|
|
4
|
+
class CommandLineToken
|
|
5
|
+
attr_reader :name #:ndoc:
|
|
6
|
+
attr_reader :aliases #:ndoc:
|
|
7
|
+
attr_reader :description #:ndoc:
|
|
8
|
+
attr_reader :long_description #:ndoc:
|
|
9
|
+
|
|
10
|
+
def initialize(names,description,long_description=nil) #:ndoc:
|
|
11
|
+
@description = description
|
|
12
|
+
@long_description = long_description
|
|
13
|
+
@name,@aliases,@names = parse_names(names)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def usage #:nodoc:
|
|
17
|
+
all_forms
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Sort based on name
|
|
21
|
+
def <=>(other)
|
|
22
|
+
self.name.to_s <=> other.name.to_s
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
# Returns a string of all possible forms
|
|
27
|
+
# of this flag. Mostly intended for printing
|
|
28
|
+
# to the user.
|
|
29
|
+
def all_forms(joiner=', ')
|
|
30
|
+
forms = all_forms_a
|
|
31
|
+
forms.join(joiner)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
# Handles dealing with the "names" param, parsing
|
|
36
|
+
# it into the primary name and aliases list
|
|
37
|
+
def parse_names(names)
|
|
38
|
+
# Allow strings; convert to symbols
|
|
39
|
+
names = [names].flatten.map { |name| name.to_sym }
|
|
40
|
+
names_hash = Hash.new
|
|
41
|
+
names.each do |name|
|
|
42
|
+
raise ArgumentError.new("#{name} has spaces; they are not allowed") if name.to_s =~ /\s/
|
|
43
|
+
names_hash[self.class.name_as_string(name)] = true
|
|
44
|
+
end
|
|
45
|
+
name = names.shift
|
|
46
|
+
aliases = names.length > 0 ? names : nil
|
|
47
|
+
[name,aliases,names_hash]
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def all_forms_a
|
|
51
|
+
forms = [self.class.name_as_string(name)]
|
|
52
|
+
if aliases
|
|
53
|
+
forms |= aliases.collect { |one_alias| self.class.name_as_string(one_alias) }.sort { |one,two| two.length <=> one.length }
|
|
54
|
+
end
|
|
55
|
+
forms
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
module GLI
|
|
2
|
+
|
|
3
|
+
# Mixin that both GLI and Command can use to copy command-line options to the aliased versions
|
|
4
|
+
# of flags and switches
|
|
5
|
+
#
|
|
6
|
+
# includers must provide the methods +flags+ and +switches+ that return an Array of Flag or Switch,
|
|
7
|
+
# respectively
|
|
8
|
+
module CopyOptionsToAliases # :nodoc:
|
|
9
|
+
# For each option in options, copies its value to keys for the aliases of the flags or
|
|
10
|
+
# switches in gli_like
|
|
11
|
+
#
|
|
12
|
+
# options - Hash of options parsed from command line; this is an I/O param
|
|
13
|
+
def copy_options_to_aliases(options) # :nodoc:
|
|
14
|
+
new_options = {}
|
|
15
|
+
options.each do |key,value|
|
|
16
|
+
if flags[key] && flags[key].aliases
|
|
17
|
+
copy_aliases(flags[key].aliases,new_options,value)
|
|
18
|
+
elsif switches[key] && switches[key].aliases
|
|
19
|
+
copy_aliases(switches[key].aliases,new_options,value)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
options.merge!(new_options)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
|
|
27
|
+
def copy_aliases(aliases,new_options,value)
|
|
28
|
+
aliases.each do |alias_name|
|
|
29
|
+
new_options[alias_name] = value
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
module GLI
|
|
2
|
+
# Indicates that the command line invocation was bad
|
|
3
|
+
class BadCommandLine < Exception
|
|
4
|
+
def exit_code; -1; end
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
# Indicates the bad command line was an unknown command
|
|
8
|
+
class UnknownCommand < BadCommandLine
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# Indicates the bad command line was an unknown global argument
|
|
12
|
+
class UnknownGlobalArgument < BadCommandLine
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Indicates the bad command line was an unknown command argument
|
|
16
|
+
class UnknownCommandArgument < BadCommandLine
|
|
17
|
+
attr_reader :command
|
|
18
|
+
# +message+:: the error message to show the user
|
|
19
|
+
# +command+:: the command we were using to parse command-specific options
|
|
20
|
+
def initialize(message,command)
|
|
21
|
+
super(message)
|
|
22
|
+
@command = command
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Raise this if you want to use an exit status that isn't the default
|
|
27
|
+
# provided by GLI. Note that GLI#exit_now! might be a bit more to your liking.
|
|
28
|
+
#
|
|
29
|
+
# Example:
|
|
30
|
+
#
|
|
31
|
+
# raise CustomExit.new("Not connected to DB",-5) unless connected?
|
|
32
|
+
# raise CustomExit.new("Bad SQL",-6) unless valid_sql?(args[0])
|
|
33
|
+
#
|
|
34
|
+
class CustomExit < Exception
|
|
35
|
+
attr_reader :exit_code #:nodoc:
|
|
36
|
+
# Create a custom exit exception
|
|
37
|
+
#
|
|
38
|
+
# +message+:: String containing error message to show the user
|
|
39
|
+
# +exit_code+:: the exit code to use (as an Int), overridding GLI's default
|
|
40
|
+
def initialize(message,exit_code)
|
|
41
|
+
super(message)
|
|
42
|
+
@exit_code = exit_code
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
require 'gli/command_line_token.rb'
|
|
2
|
+
require 'gli/switch.rb'
|
|
3
|
+
|
|
4
|
+
module GLI
|
|
5
|
+
# Defines a flag, which is to say a switch that takes an argument
|
|
6
|
+
class Flag < Switch # :nodoc:
|
|
7
|
+
|
|
8
|
+
attr_accessor :default_value
|
|
9
|
+
|
|
10
|
+
def initialize(names,description,argument_name=nil,default=nil,long_desc=nil)
|
|
11
|
+
super(names,description,long_desc)
|
|
12
|
+
@argument_name = argument_name || "arg"
|
|
13
|
+
@default_value = default
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def get_value!(args)
|
|
17
|
+
args.each_index() do |index|
|
|
18
|
+
arg = args[index]
|
|
19
|
+
present,matched,value = find_me(arg)
|
|
20
|
+
if present
|
|
21
|
+
args.delete_at index
|
|
22
|
+
if !value || value == ''
|
|
23
|
+
if args[index]
|
|
24
|
+
value = args[index]
|
|
25
|
+
args.delete_at index
|
|
26
|
+
return value
|
|
27
|
+
else
|
|
28
|
+
raise BadCommandLine.new("#{matched} requires an argument")
|
|
29
|
+
end
|
|
30
|
+
else
|
|
31
|
+
return value
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
return @default_value
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def find_me(arg)
|
|
39
|
+
if @names[arg]
|
|
40
|
+
return [true,arg,nil] if arg.length == 2
|
|
41
|
+
# This means we matched the long-form, but there's no argument
|
|
42
|
+
raise BadCommandLine.new("#{arg} requires an argument via #{arg}=argument")
|
|
43
|
+
end
|
|
44
|
+
@names.keys.each() do |name|
|
|
45
|
+
match_string = "^#{name}=(.*)$"
|
|
46
|
+
match_data = arg.match(match_string)
|
|
47
|
+
return [true,name,$1] if match_data;
|
|
48
|
+
end
|
|
49
|
+
[false,nil,nil]
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Returns a string of all possible forms
|
|
53
|
+
# of this flag. Mostly intended for printing
|
|
54
|
+
# to the user.
|
|
55
|
+
def all_forms(joiner=', ')
|
|
56
|
+
forms = all_forms_a
|
|
57
|
+
string = forms.join(joiner)
|
|
58
|
+
if forms[-1] =~ /^\-\-/
|
|
59
|
+
string += '='
|
|
60
|
+
else
|
|
61
|
+
string += ' '
|
|
62
|
+
end
|
|
63
|
+
string += @argument_name
|
|
64
|
+
return string
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require 'ostruct'
|
|
2
|
+
|
|
3
|
+
module GLI
|
|
4
|
+
# Subclass of OpenStruct that provides hash-like methods for #[] and #[]=. Note that is is *not* a Hash.
|
|
5
|
+
class Options < OpenStruct
|
|
6
|
+
|
|
7
|
+
# Return the value of an attribute
|
|
8
|
+
def[](k)
|
|
9
|
+
@table[k.to_sym]
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Set the value of an attribute
|
|
13
|
+
def[]=(k, v)
|
|
14
|
+
@table[k.to_sym] = v
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
require 'gli/command_line_token.rb'
|
|
2
|
+
|
|
3
|
+
module GLI
|
|
4
|
+
# Defines a command line switch
|
|
5
|
+
class Switch < CommandLineToken #:nodoc:
|
|
6
|
+
|
|
7
|
+
def initialize(names,description,long_desc=nil)
|
|
8
|
+
super(names,description,long_desc)
|
|
9
|
+
@default_value = false
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Given the argument list, scans it looking for this switch
|
|
13
|
+
# returning true if it's in the argumennt list (and removing it from the argument list)
|
|
14
|
+
def get_value!(args)
|
|
15
|
+
idx = -1
|
|
16
|
+
args.each_index do |index|
|
|
17
|
+
result = find_me(args[index])
|
|
18
|
+
if result[0]
|
|
19
|
+
if result[1]
|
|
20
|
+
args[index] = result[1]
|
|
21
|
+
else
|
|
22
|
+
args.delete_at index
|
|
23
|
+
end
|
|
24
|
+
return result[0]
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
@default_value
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Used only to configure what's returned if we do not detect this switch on the command line
|
|
31
|
+
# This allows the configuration file to set a switch as always on
|
|
32
|
+
def default_value=(default)
|
|
33
|
+
@default_value = default
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Finds the switch in the given arg, returning the arg to keep.
|
|
37
|
+
# Returns an array of size 2:
|
|
38
|
+
# index 0:: true or false if the arg was found
|
|
39
|
+
# index 1:: the remaining arg to keep in the command line or nil to remove it
|
|
40
|
+
def find_me(arg)
|
|
41
|
+
if @names[arg]
|
|
42
|
+
return [true,nil]
|
|
43
|
+
end
|
|
44
|
+
@names.keys.each() do |name|
|
|
45
|
+
if name =~ /^-(\w)$/
|
|
46
|
+
match_string = "^\\-(\\w*)#{$1}(\\w*)$"
|
|
47
|
+
match_data = arg.match(match_string)
|
|
48
|
+
if match_data
|
|
49
|
+
# Note that if [1] and [2] were both empty
|
|
50
|
+
# we'd have returned above
|
|
51
|
+
return [true, "-" + match_data[1] + match_data[2]]
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
[false]
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def self.name_as_string(name)
|
|
59
|
+
string = name.to_s
|
|
60
|
+
string.length == 1 ? "-#{string}" : "--#{string}"
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
module GLI
|
|
2
|
+
# Class to encapsulate stuff about the terminal. This is useful to application developers
|
|
3
|
+
# as a canonical means to get information about the user's current terminal configuraiton.
|
|
4
|
+
# GLI uses this to determine the number of columns to use when printing to the screen.
|
|
5
|
+
#
|
|
6
|
+
# To access it, use Terminal#instance. This is a singleton mostly to facilitate testing, but
|
|
7
|
+
# it seems reasonable enough, since there's only one terminal in effect
|
|
8
|
+
#
|
|
9
|
+
# Example:
|
|
10
|
+
#
|
|
11
|
+
# Terminal.instance.size[0] # => columns in the terminal
|
|
12
|
+
# Terminal.default_size = [128,24] # => change default when we can't figure it out
|
|
13
|
+
# raise "no ls?!?!?" unless Terminal.instance.command_exists?("ls")
|
|
14
|
+
#
|
|
15
|
+
class Terminal
|
|
16
|
+
|
|
17
|
+
@@default_size = [80,24]
|
|
18
|
+
|
|
19
|
+
# Get the default size of the terminal when we can't figure it out
|
|
20
|
+
#
|
|
21
|
+
# Returns an array of int [cols,rows]
|
|
22
|
+
def self.default_size
|
|
23
|
+
@@default_size
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Set the default size of the terminal to use when we can't figure it out
|
|
27
|
+
#
|
|
28
|
+
# +size+:: array of two int [cols,rows]
|
|
29
|
+
def self.default_size=(size)
|
|
30
|
+
@@default_size = size
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Provide access to the shared instance.
|
|
34
|
+
def self.instance; @@instance ||= Terminal.new; end
|
|
35
|
+
|
|
36
|
+
# Call this to cause methods to throw exceptions rather than return a sane default. You
|
|
37
|
+
# probably don't want to call this unless you are writing tests
|
|
38
|
+
def make_unsafe!
|
|
39
|
+
@unsafe = true
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Returns true if the given command exists on this system
|
|
43
|
+
#
|
|
44
|
+
# +command+:: The command, as a String, to check for, without any path information.
|
|
45
|
+
def command_exists?(command)
|
|
46
|
+
ENV['PATH'].split(File::PATH_SEPARATOR).any? {|dir| File.exists? File.join(dir, command) }
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Get the size of the current terminal.
|
|
50
|
+
# Ripped from hirb[https://github.com/cldwalker/hirb/blob/master/lib/hirb/util.rb]
|
|
51
|
+
#
|
|
52
|
+
# Returns an Array of size two Ints representing the terminal width and height
|
|
53
|
+
def size
|
|
54
|
+
if (ENV['COLUMNS'] =~ /^\d+$/) && (ENV['LINES'] =~ /^\d+$/)
|
|
55
|
+
[ENV['COLUMNS'].to_i, ENV['LINES'].to_i]
|
|
56
|
+
elsif (jruby? || (!STDIN.tty? && ENV['TERM'])) && command_exists?('tput')
|
|
57
|
+
[run_command('tput cols').to_i, run_command('tput lines').to_i]
|
|
58
|
+
elsif STDIN.tty? && command_exists?('stty')
|
|
59
|
+
run_command('stty size').scan(/\d+/).map { |size_element| size_element.to_i }.reverse
|
|
60
|
+
else
|
|
61
|
+
Terminal.default_size
|
|
62
|
+
end
|
|
63
|
+
rescue Exception => ex
|
|
64
|
+
raise ex if @unsafe
|
|
65
|
+
Terminal.default_size
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
private
|
|
69
|
+
|
|
70
|
+
# Runs a command using backticks. Extracted to allow for testing
|
|
71
|
+
def run_command(command)
|
|
72
|
+
`#{command}`
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# True if we are JRuby; exposed to allow for testing
|
|
76
|
+
def jruby?; RUBY_PLATFORM =~ /java/; end
|
|
77
|
+
|
|
78
|
+
end
|
|
79
|
+
end
|