lib/commandbase.rb in narou-1.6.4 vs lib/commandbase.rb in narou-1.7.0
- old
+ new
@@ -1,125 +1,125 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright 2013 whiteleaf. All rights reserved.
-#
-
-require "optparse"
-
-module Command
- class CommandBase
- # postfixies は改行で区切ることで2パターン以上記述できる
- def initialize(postfixies = "")
- @opt = OptionParser.new(nil, 20)
- command_name = self.class.to_s.scan(/::(.+)$/)[0][0].downcase
- banner = postfixies.split("\n").map.with_index { |postfix, i|
- (i == 0 ? "Usage: " : " or: ") + "narou #{command_name} #{postfix}"
- }.join("\n")
- @opt.banner = "<bold><green>#{TermColor.escape(banner)}</green></bold>".termcolor
- @options = {}
- # ヘルプを見やすく色付け
- def @opt.help
- msg = super
- # 見出し部分
- msg.gsub!(/((?:Examples|Options|Configuration|[^\s]+? Variable List):)/) do
- "<underline><bold>#{$1}</bold></underline>".termcolor
- end
- # Examples のコメント部分
- msg.gsub!(/(#.+)$/) do
- "<cyan>#{TermColor.escape($1)}</cyan>".termcolor
- end
- # 文字列部分
- msg.gsub!(/(".+?")/) do
- "<yellow>#{TermColor.escape($1)}</yellow>".termcolor
- end
- msg
- end
- end
-
- def execute(argv)
- @options.clear
- load_local_settings
- @opt.parse!(argv)
- rescue OptionParser::InvalidOption => e
- error "不明なオプションです(#{e})"
- exit 1
- rescue OptionParser::MissingArgument => e
- error "オプションの引数が指定されていないか正しくありません(#{e})"
- exit 1
- end
-
- def load_local_settings
- command_prefix = self.class.to_s.scan(/[^:]+$/)[0].downcase
- local_settings = Inventory.load("local_setting", :local)
- local_settings.each do |name, value|
- if name =~ /^#{command_prefix}\.(.+)$/
- @options[$1] = value
- end
- end
- end
-
- #
- # タグ情報をID情報に展開する
- #
- def tagname_to_ids(array)
- database = Database.instance
- tag_index = Hash.new { [] }
- database.each do |id, data|
- tags = data["tags"] || []
- tags.each do |tag|
- tag_index[tag] |= [id]
- end
- end
- array.map! { |arg|
- ids = tag_index[arg]
- ids.empty? ? arg : ids
- }.flatten!
- end
-
- #
- # 普通にコマンドを実行するけど、exit(2) を補足してexitstatus を返す
- # 正常終了なら0
- #
- def self.execute!(argv)
- self.new.execute(argv)
- rescue SystemExit => e
- e.status
- else
- 0
- end
-
- def self.oneline_help(msg)
- ""
- end
-
- #
- # 指定したメソッドを呼び出す際に、フック関数があればそれ経由で呼ぶ
- #
- # 指定したメソッドは存在しなくてもいい。存在しなければ空のProcが作られる
- #
- def hook_call(target_method, *argv)
- hook = "hook_#{target_method}"
- target_method_proc = self.method(target_method) rescue ->{}
- if respond_to?(hook)
- self.__send__(hook, *argv, &target_method_proc)
- else
- target_method_proc.call(*argv)
- end
- end
-
- #
- # 設定の強制設定
- #
- def force_change_settings_function(pairs)
- settings = Inventory.load("local_setting", :local)
- modified = false
- pairs.each do |name, value|
- if settings[name].nil? || settings[name] != value
- settings[name] = value
- puts "<bold><cyan>#{name} を #{value} に強制変更しました</cyan></bold>".termcolor
- modified = true
- end
- end
- settings.save if modified
- end
- end
-end
+# -*- coding: utf-8 -*-
+#
+# Copyright 2013 whiteleaf. All rights reserved.
+#
+
+require "optparse"
+
+module Command
+ class CommandBase
+ # postfixies は改行で区切ることで2パターン以上記述できる
+ def initialize(postfixies = "")
+ @opt = OptionParser.new(nil, 20)
+ command_name = self.class.to_s.scan(/::(.+)$/)[0][0].downcase
+ banner = postfixies.split("\n").map.with_index { |postfix, i|
+ (i == 0 ? "Usage: " : " or: ") + "narou #{command_name} #{postfix}"
+ }.join("\n")
+ @opt.banner = "<bold><green>#{TermColorLight.escape(banner)}</green></bold>".termcolor
+ @options = {}
+ # ヘルプを見やすく色付け
+ def @opt.help
+ msg = super
+ # 見出し部分
+ msg.gsub!(/((?:Examples|Options|Configuration|[^\s]+? Variable List):)/) do
+ "<underline><bold>#{$1}</bold></underline>".termcolor
+ end
+ # Examples のコメント部分
+ msg.gsub!(/(#.+)$/) do
+ "<cyan>#{TermColorLight.escape($1)}</cyan>".termcolor
+ end
+ # 文字列部分
+ msg.gsub!(/(".+?")/) do
+ "<yellow>#{TermColorLight.escape($1)}</yellow>".termcolor
+ end
+ msg
+ end
+ end
+
+ def execute(argv)
+ @options.clear
+ load_local_settings
+ @opt.parse!(argv)
+ rescue OptionParser::InvalidOption => e
+ error "不明なオプションです(#{e})"
+ exit 1
+ rescue OptionParser::MissingArgument => e
+ error "オプションの引数が指定されていないか正しくありません(#{e})"
+ exit 1
+ end
+
+ def load_local_settings
+ command_prefix = self.class.to_s.scan(/[^:]+$/)[0].downcase
+ local_settings = Inventory.load("local_setting", :local)
+ local_settings.each do |name, value|
+ if name =~ /^#{command_prefix}\.(.+)$/
+ @options[$1] = value
+ end
+ end
+ end
+
+ #
+ # タグ情報をID情報に展開する
+ #
+ def tagname_to_ids(array)
+ database = Database.instance
+ tag_index = Hash.new { [] }
+ database.each do |id, data|
+ tags = data["tags"] || []
+ tags.each do |tag|
+ tag_index[tag] |= [id]
+ end
+ end
+ array.map! { |arg|
+ ids = tag_index[arg]
+ ids.empty? ? arg : ids
+ }.flatten!
+ end
+
+ #
+ # 普通にコマンドを実行するけど、exit(2) を補足してexitstatus を返す
+ # 正常終了なら0
+ #
+ def self.execute!(argv)
+ self.new.execute(argv)
+ rescue SystemExit => e
+ e.status
+ else
+ 0
+ end
+
+ def self.oneline_help
+ ""
+ end
+
+ #
+ # 指定したメソッドを呼び出す際に、フック関数があればそれ経由で呼ぶ
+ #
+ # 指定したメソッドは存在しなくてもいい。存在しなければ空のProcが作られる
+ #
+ def hook_call(target_method, *argv)
+ hook = "hook_#{target_method}"
+ target_method_proc = self.method(target_method) rescue ->{}
+ if respond_to?(hook)
+ self.__send__(hook, *argv, &target_method_proc)
+ else
+ target_method_proc.call(*argv)
+ end
+ end
+
+ #
+ # 設定の強制設定
+ #
+ def force_change_settings_function(pairs)
+ settings = Inventory.load("local_setting", :local)
+ modified = false
+ pairs.each do |name, value|
+ if settings[name].nil? || settings[name] != value
+ settings[name] = value
+ puts "<bold><cyan>#{name} を #{value} に強制変更しました</cyan></bold>".termcolor
+ modified = true
+ end
+ end
+ settings.save if modified
+ end
+ end
+end