lib/helper.rb in narou-2.6.1 vs lib/helper.rb in narou-2.7.0

- old
+ new

@@ -3,10 +3,11 @@ # Copyright 2013 whiteleaf. All rights reserved. # require "open3" require "time" +require "systemu" # # 雑多なお助けメソッド群 # module Helper @@ -174,12 +175,14 @@ "true/false " when :integer "整数 " when :float "小数点数 " - when :string, :select, :multiple + when :string, :select "文字列 " + when :multiple + "文字列(複数)" when :directory "フォルダパス" when :file "ファイルパス" else @@ -284,44 +287,72 @@ end result end # + # 伏せ字にする + # + # 数字やスペース、句読点、感嘆符はそのままにする + # + def to_unprintable_words(string, mask = "●") + result = "" + string.each_char do |char| + result += case char + when /[0-90-9  、。!?!?]/ + char + else + mask + end + end + result + end + + # # 外部コマンド実行中の待機ループの処理を書けるクラス # + # 返り値:[標準出力のキャプチャ, 標準エラーのキャプチャ, Process::Status] + # # response = Helper::AsyncCommand.exec("処理に時間がかかる外部コマンド") do # print "*" # end # if response[2].success? # puts "成功しました" # end # class AsyncCommand def self.exec(command, sleep_time = 0.5, &block) - Thread.new { - loop do - block.call if block - sleep(sleep_time) + looper = nil + _pid = nil + status, stdout, stderr = systemu(command) do |pid| + _pid = pid + looper = Thread.new(pid) do |pid| + loop do + block.call if block + sleep(sleep_time) + if Narou::Worker.canceled? + Process.kill("KILL", pid) + Process.detach(pid) + break + end + end end - }.tap { |th| + looper.join + looper = nil + end + stdout.force_encoding(Encoding::UTF_8) + stderr.force_encoding(Encoding::UTF_8) + return [stdout, stderr, status] + rescue Interrupt + if _pid begin - if Helper.engine_jruby? - # MEMO: - # Open3.capture3 - 全く動かない - # `` バッククウォート - 出力が文字化けする - res = Open3.popen3(command) { |i, o, e| - i.close - `cd` # create dummy Process::Status object to $? - [o.read, e.read, $?] - } - else - res = Open3.capture3(command) - end - ensure - th.kill + Process.kill("KILL", _pid) + Process.detach(_pid) # 死亡確認しないとゾンビ化する + rescue end - return res - } + end + raise + ensure + looper.kill if looper end end # # 更新時刻を考慮したファイルのローダー