Skip to content

Instantly share code, notes, and snippets.

@shiraji
Last active December 17, 2015 22:49
Show Gist options
  • Save shiraji/5684596 to your computer and use it in GitHub Desktop.
Save shiraji/5684596 to your computer and use it in GitHub Desktop.
#! /usr/local/bin/ruby
########################################################################
#
# Rubyのバッチ処理でよく使うであろう処理が書かれたクラス。
# よく使うオプションをclass_optionに設定し、
# このクラスを継承したクラスで利用できるようになっている。
#
########################################################################
require 'thor'
require 'logger'
class MyThor < Thor
# applicaton.ymlのパス。Example: ../../config/application
APPLICATION_YML = '__FILL_IN_APPLICATION_YML_PATH__'
############################################################################
#
# Help option
#
############################################################################
class_option :help, :type => :boolean, :aliases => '-h', :desc => 'Show Help'
############################################################################
#
# Log option
# 以下の設定を受け付ける。これら以外の場合、Railsの設定を利用する。
# FATAL, ERROR, WARN, INFO, DEBUG
#
############################################################################
class_option :log_level, :type => :string, :aliases => '-l',:desc => 'Log settings: FATAL, ERROR, WARN, INFO, DEBUG is the possible values'
############################################################################
#
# Logの出力先オプション
# 出力先のファイルパスを指定するとそこにログをはく。
# log_levelの設定をしていない限り、このオプションは無視される。
# 指定がない場合、Rails.loggerの設定を利用する。
#
############################################################################
class_option :log_file, :type => :string, :aliases => '-f', :desc => 'Log output settings. Inorder to use this setting, set log_level'
############################################################################
#
# Railsの環境変数。Rails.envの値を上書きします。
# production, development, testの値を許可しています。
# それ以外の値だった場合、Railsの設定を利用する。
#
############################################################################
class_option :environment, :type => :string, :aliases => '-e', :default => 'test', :desc => 'Environment value. Overwrite Rails.env with this value.'
############################################################################
#
# コマンドとして、認識したくないメソッド。
# 共通のメソッドをここに書くようにする。
#
############################################################################
no_commands do
############################################################################
#
# Thorのinvoke_commandを継承したメソッド
# メソッドが呼ばれる前に、パラメータを設定できるようにする。
#
# ■注意点
# Thorの更新をした場合、invoke_commandメソッドの呼ぶタイミングが変更される恐れあり。
# Thorのバージョン更新には十分気をつけてください。
# Thor.invoke_command
# Thor.dispath
# Thor.start
# などを参照してみてください。
#
############################################################################
def invoke_command(command, *args)
prepare
super
end
############################################################################
#
# 共通のパラメータの設定をする
#
# ■注意点■
# パラメータ追加時はこのメソッドに必ず追加すること。
# NpThorを継承しているクラスはこのメソッド呼び、パラメータの設定をすること。
#
############################################################################
def prepare
load_application_yml
set_environment
set_log_file
set_log_level
load_rails_environment
end
############################################################################
#
# application.ymlを読み込む。
#
############################################################################
def load_application_yml
require File.expand_path(APPLICATION_YML, __FILE__)
end
############################################################################
#
# Ralsの環境変数を読み込む。
#
############################################################################
def load_rails_environment
Rails.application.require_environment!
end
############################################################################
#
# Rails.envの値を設定する。
# :environmentがnilだった場合、上書きをせずに、
# Rails.envの値を利用する。
#
############################################################################
def set_environment
if options[:environment] != nil
Rails.env = options[:environment]
end
end
############################################################################
#
# ログレベルを設定するメソッド
# このメソッドで定義された、Rails.loggerを利用して、バッチのログを出力する。
# Rails.loggerがnullの場合、Initializerで設定したRails.loggerを利用し、この設定は無視する。
#
# 理由として、Rails.application.require_environment!をしていないため、Rails.loggerがない。
# Rails.application.require_environment!を先にやるとDatabase関連のログが吐き出されて個人的に気分が悪い。
#
############################################################################
def set_log_level
if options[:log_level] != nil && Rails.logger != nil
case options[:log_level].upcase
when 'FATAL' then
Rails.logger.level = Logger::FATAL
when 'ERROR' then
Rails.logger.level = Logger::ERROR
when 'WARN' then
Rails.logger.level = Logger::WARN
when 'DEBUG' then
Rails.logger.level = Logger::DEBUG
when 'INFO' then
Rails.logger.level = Logger::INFO
end
end
end
############################################################################
#
# ログの出力先を設定するメソッド
# 入力値がSTDOUT, STDIN, STDERRだった場合、
# Logger.new(STDOUT)
# Logger.new(STDIN)
# Logger.new(STDERR)
# を利用する。
# 入力値が何もなかった場合、Initializerで設定したRails.loggerを利用する。
#
############################################################################
def set_log_file
if options[:log_file] != nil
case options[:log_file].upcase
when 'STDOUT' then
Rails.logger = Logger.new(STDOUT)
when 'STDIN' then
Rails.logger = Logger.new(STDIN)
when 'STDERR' then
Rails.logger = Logger.new(STDERR)
else
Rails.logger = Logger.new(options[:log_file])
end
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment