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 if command_name == 'help'
73 command = get_command_class(command_name).new(logger)
74 logger.debug "Run command #{command_name}"
77 rescue OSDNClient::ApiError => e
79 err = JSON.parse(e.response_body)
81 logger.fatal "#{err["status"]}: #{err["message"]}"
82 elsif err["error_description"]
83 logger.fatal err["error_description"]
85 logger.fatal "Command failed: #{e.inspect}"
88 logger.fatal "Command failed: #{e.inspect}"
94 command_name = ARGV.shift
96 get_command_class(command_name).new(logger).help
98 puts "#{$0} [global-options] <command> [command-options] [args]"
99 puts "#{$0} help <command>"
100 puts "Global Options:"
101 puts " -h --help Show help message. use 'help <command>' for specific command. "
102 puts " -v --verbose Increase log level (multiple)"
103 puts " -q --quiet Decrease log level (multiple)"
104 puts "Avaiable Commands:"
106 OSDN::CLI::Command.constants.each do |c|
107 c = c.to_s.split(/(?=[A-Z])/).join('_').downcase
109 puts " %-14s %s" % [c, get_command_class(c).description]