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
#
# 更新時刻を考慮したファイルのローダー