class Toys::Completion::FileSystem

A Completion that returns candidates from the local file system.

Attributes

cwd[R]

Path to the starting directory. @return [String]

include_directories[R]

Whether directories are included in the completion candidates. @return [Boolean]

include_files[R]

Whether files are included in the completion candidates. @return [Boolean]

prefix_constraint[R]

Constraint on the fragment prefix. @return [String,Regexp]

Public Class Methods

new(cwd: nil, omit_files: false, omit_directories: false, prefix_constraint: "") click to toggle source

Create a completion that gets candidates from names in the local file system.

@param cwd [String] Working directory (defaults to the current dir). @param omit_files [Boolean] Omit files from candidates @param omit_directories [Boolean] Omit directories from candidates @param prefix_constraint [String,Regexp] Constraint on the fragment

prefix. Defaults to requiring the prefix be empty.
Calls superclass method
# File lib/toys/completion.rb, line 238
def initialize(cwd: nil, omit_files: false, omit_directories: false, prefix_constraint: "")
  super()
  @cwd = cwd || ::Dir.pwd
  @include_files = !omit_files
  @include_directories = !omit_directories
  @prefix_constraint = prefix_constraint
end

Public Instance Methods

call(context) click to toggle source

Returns candidates for the current completion.

@param context [Toys::Completion::Context] the current completion

context including the string fragment.

@return [Array<Toys::Completion::Candidate>] an array of candidates

# File lib/toys/completion.rb, line 277
def call(context)
  return [] unless @prefix_constraint === context.fragment_prefix
  substring = context.fragment
  prefix, name =
    if substring.empty? || substring.end_with?("/")
      [substring, ""]
    else
      ::File.split(substring)
    end
  dir = ::File.expand_path(prefix, @cwd)
  return [] unless ::File.directory?(dir)
  prefix = nil if [".", ""].include?(prefix)
  omits = [".", "..", ""]
  children = Compat.glob_in_dir(name, dir).find_all do |child|
    !omits.include?(child)
  end
  children += ::Dir.entries(dir).find_all do |child|
    child.start_with?(name) && !omits.include?(child)
  end
  generate_candidates(children.uniq.sort, prefix, dir)
end

Private Instance Methods

generate_candidates(children, prefix, dir) click to toggle source
# File lib/toys/completion.rb, line 301
def generate_candidates(children, prefix, dir)
  children.flat_map do |child|
    path = ::File.join(dir, child)
    str = prefix ? ::File.join(prefix, child) : child
    if ::File.file?(path)
      @include_files ? [Candidate.new(str)] : []
    elsif ::File.directory?(path)
      if @include_directories
        [Candidate.new("#{str}/", partial: true)]
      else
        []
      end
    else
      []
    end
  end
end