Class: Rufio::LocalScriptScanner

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

Overview

閲覧中ディレクトリのスクリプトファイルを検出するスキャナーカレントディレクトリ直下のスクリプトファイル(.sh, .rb, .py等)を検出し、コマンドモードから @script.sh 形式で実行可能にする

Constant Summary collapse

SUPPORTED_EXTENSIONS =

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

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

Instance Method Summary collapse

Constructor Details

#initialize(directory = nil) ⇒ LocalScriptScanner

Returns a new instance of LocalScriptScanner.

Parameters:

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

    スキャン対象ディレクトリ



12
13
14
15
# File 'lib/rufio/local_script_scanner.rb', line 12

def initialize(directory = nil)
  @directory = directory
  @scripts_cache = nil
end

Instance Method Details

#available_scriptsArray<Hash>

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

Returns:

  • (Array<Hash>)

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



28
29
30
# File 'lib/rufio/local_script_scanner.rb', line 28

def available_scripts
  @scripts_cache ||= scan_scripts
end

#complete(prefix) ⇒ Array<String>

Tab補完候補を取得

Parameters:

  • prefix (String)

    入力中の文字列

Returns:

  • (Array<String>)

    補完候補のスクリプト名



52
53
54
55
56
57
# File 'lib/rufio/local_script_scanner.rb', line 52

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

#find_script(name) ⇒ Hash?

名前でスクリプトを検索

Parameters:

  • name (String)

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

Returns:

  • (Hash, nil)

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



35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/rufio/local_script_scanner.rb', line 35

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

#update_directory(directory) ⇒ Object

ディレクトリ変更時にキャッシュを無効化

Parameters:

  • directory (String)

    新しいディレクトリ



19
20
21
22
23
24
# File 'lib/rufio/local_script_scanner.rb', line 19

def update_directory(directory)
  return if @directory == directory

  @directory = directory
  @scripts_cache = nil
end