class Toys::Completion::FileSystem
A Completion
that returns candidates from the local file system.
Attributes
Path to the starting directory. @return [String]
Whether directories are included in the completion candidates. @return [Boolean]
Whether files are included in the completion candidates. @return [Boolean]
Constraint on the fragment prefix. @return [String,Regexp]
Public Class Methods
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.
# 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
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
# 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