Class: Rufio::ScriptRunner

Inherits:
Object
  • Object
show all
Defined in:
lib/rufio/script_runner.rb

Overview

スクリプトパスからスクリプトを検索・実行するクラスジョブマネージャーと連携してバックグラウンド実行を管理

Constant Summary collapse

SUPPORTED_EXTENSIONS =

サポートするスクリプト拡張子

%w[.sh .rb .py .pl .js .ts .ps1].freeze

Instance Method Summary collapse

Constructor Details

#initialize(script_paths:, job_manager: nil, command_logger: nil) ⇒ ScriptRunner

Returns a new instance of ScriptRunner.

Parameters:

  • script_paths (Array<String>)

    スクリプトを検索するディレクトリのリスト

  • job_manager (JobManager, nil) (defaults to: nil)

    ジョブマネージャー(nilの場合は同期実行)

  • command_logger (CommandLogger, nil) (defaults to: nil)

    コマンドロガー



15
16
17
18
19
20
# File 'lib/rufio/script_runner.rb', line 15

def initialize(script_paths:, job_manager: nil, command_logger: nil)
  @script_paths = script_paths.map { |p| File.expand_path(p) }
  @job_manager = job_manager
  @command_logger = command_logger
  @scripts_cache = nil
end

Instance Method Details

#available_scriptsArray<Hash>

利用可能なスクリプト一覧を取得

Returns:

  • (Array<Hash>)

    スクリプト情報の配列 [{ name:, path:, dir: }, …]



24
25
26
# File 'lib/rufio/script_runner.rb', line 24

def available_scripts
  @scripts_cache ||= scan_scripts
end

#clear_cacheObject

キャッシュをクリア



72
73
74
# File 'lib/rufio/script_runner.rb', line 72

def clear_cache
  @scripts_cache = nil
end

#complete(prefix) ⇒ Array<String>

スクリプト名の補完候補を取得

Parameters:

  • prefix (String)

    入力中の文字列

Returns:

  • (Array<String>)

    補完候補のスクリプト名



48
49
50
51
52
53
54
# File 'lib/rufio/script_runner.rb', line 48

def complete(prefix)
  available_scripts
    .map { |s| s[:name] }
    .select { |name| name.start_with?(prefix) }
    .uniq
    .sort
end

#find_script(name) ⇒ Hash?

スクリプト名で検索

Parameters:

  • name (String)

    スクリプト名(拡張子あり/なし)

Returns:

  • (Hash, nil)

    スクリプト情報 { name:, path:, dir: } または nil



31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/rufio/script_runner.rb', line 31

def find_script(name)
  # 完全一致を優先
  script = available_scripts.find { |s| s[:name] == name }
  return script if script

  # 拡張子なしで検索
  SUPPORTED_EXTENSIONS.each do |ext|
    script = available_scripts.find { |s| s[:name] == "#{name}#{ext}" }
    return script if script
  end

  nil
end

#run(name, working_dir:, args: nil, selected_file: nil, selected_dir: nil) ⇒ TaskStatus?

スクリプトをジョブとして実行

Parameters:

  • name (String)

    スクリプト名

  • working_dir (String)

    作業ディレクトリ

  • args (String, nil) (defaults to: nil)

    スクリプトに渡す引数

  • selected_file (String, nil) (defaults to: nil)

    選択中のファイル

  • selected_dir (String, nil) (defaults to: nil)

    選択中のディレクトリ

Returns:

  • (TaskStatus, nil)

    作成されたジョブ、またはスクリプトが見つからない場合nil



63
64
65
66
67
68
69
# File 'lib/rufio/script_runner.rb', line 63

def run(name, working_dir:, args: nil, selected_file: nil, selected_dir: nil)
  script = find_script(name)
  return nil unless script

  env = build_environment(working_dir, selected_file, selected_dir)
  execute_script(script, working_dir, env, args)
end