9 @logger = Logger.new(STDERR)
10 @logger.level = Logger::WARN
11 @logger.formatter = proc { |severity, time, progname, msg|
12 "[%s] %s\n" % [severity, msg]
18 opts = GetoptLong.new(
19 [ '--help', '-h', GetoptLong::NO_ARGUMENT ],
20 [ '--verbose', '-v', GetoptLong::NO_ARGUMENT ],
21 [ '--quiet', '-q', GetoptLong::NO_ARGUMENT ],
23 opts.ordering = GetoptLong::REQUIRE_ORDER
24 opts.each do |opt, arg|
30 if logger.level == Logger::DEBUG
31 OSDNClient.configure do |config|
32 config.debugging = true
35 logger.level > Logger::DEBUG and
38 logger.level < Logger::UNKNOWN and
45 logger.debug "Loglevel is #{logger.level}"
48 def get_command_class(command_name)
49 class_name = command_name.to_s.split('_').map(&:capitalize).join
51 return self.class.const_get("OSDN::CLI::Command::#{class_name}")
53 logger.fatal "Invalid command name '#{command_name}'. Use 'help' to list commands."
62 command_name = ARGV.shift
68 OSDNClient.configure do |config|
70 config.verify_ssl = false
71 config.logger.level = logger.level
74 if command_name == 'help'
79 command = get_command_class(command_name).new(logger)
80 logger.debug "Run command #{command_name}"
83 rescue OSDNClient::ApiError => e
85 err = JSON.parse(e.response_body)
87 logger.fatal "#{err["status"]}: #{err["message"]}"
88 elsif err["error_description"]
89 logger.fatal err["error_description"]
91 logger.fatal "Command failed: #{e.inspect}"
94 logger.fatal "Command failed: #{e.inspect}"
100 command_name = ARGV.shift
102 get_command_class(command_name).new(logger).help
104 puts "#{$0} [global-options] <command> [command-options] [args]"
105 puts "#{$0} help <command>"
106 puts "Global Options:"
107 puts " -h --help Show help message. use 'help <command>' for specific command. "
108 puts " -v --verbose Increase log level (multiple)"
109 puts " -q --quiet Decrease log level (multiple)"
110 puts "Avaiable Commands:"
112 OSDN::CLI::Command.constants.each do |c|
113 c = c.to_s.split(/(?=[A-Z])/).join('_').downcase
115 puts " %-14s %s" % [c, get_command_class(c).description]