Sha256: b09df37f9a65d6daad7279b647a381e696c9d23ff5cc8bacb36c3bc76d6718cc

Contents?: true

Size: 1.75 KB

Versions: 15

Compression:

Stored size: 1.75 KB

Contents

class Pry
  class Command::ShellCommand < Pry::ClassCommand
    match(/\.(.*)/)
    group 'Input and Output'
    description "All text following a '.' is forwarded to the shell."
    command_options listing: '.<shell command>', use_prefix: false,
                    takes_block: true

    banner <<-'BANNER'
      Usage: .COMMAND_NAME

      All text following a "." is forwarded to the shell.

      .ls -aF
      .uname
    BANNER

    def process(cmd)
      if cmd =~ /^cd\s*(.*)/i
        process_cd parse_destination($1)
      else
        pass_block(cmd)
        if command_block
          command_block.call `#{cmd}`
        else
          _pry_.config.system.call(output, cmd, _pry_)
        end
      end
    end

    private

    def parse_destination(dest)
      return "~" if dest.empty?
      return dest unless dest == "-"

      state.old_pwd || raise(CommandError, "No prior directory available")
    end

    def process_cd(dest)
      begin
        state.old_pwd = Dir.pwd
        Dir.chdir(File.expand_path(path_from_cd_path(dest) || dest))
      rescue Errno::ENOENT
        raise CommandError, "No such directory: #{dest}"
      end
    end

    def cd_path_env
      ENV['CDPATH']
    end

    def cd_path_exists?
      cd_path_env && cd_path_env.length.nonzero?
    end

    def path_from_cd_path(dest)
      return if !(dest && cd_path_exists?) || special_case_path?(dest)

      cd_path_env.split(File::PATH_SEPARATOR).each do |path|
        if File.directory?(path) && path.split(File::SEPARATOR).last == dest
          return path
        end
      end

      return nil
    end

    def special_case_path?(dest)
      ['.', '..', '-'].include?(dest) || dest =~ /\A[#{File::PATH_SEPARATOR}~]/
    end
  end

  Pry::Commands.add_command(Pry::Command::ShellCommand)
end

Version data entries

15 entries across 15 versions & 7 rubygems

Version Path
argon-1.3.1 vendor/bundle/ruby/2.7.0/gems/pry-0.12.2/lib/pry/commands/shell_command.rb
symbolic_enum-1.1.5 vendor/bundle/ruby/2.7.0/gems/pry-0.12.2/lib/pry/commands/shell_command.rb
honeybadger-4.5.3 vendor/bundle/ruby/2.6.0/gems/pry-0.12.2/lib/pry/commands/shell_command.rb
chatops-rpc-0.0.2 fixtures/chatops-controller-example/vendor/bundle/ruby/2.5.0/gems/pry-0.12.2/lib/pry/commands/shell_command.rb
chatops-rpc-0.0.1 fixtures/chatops-controller-example/vendor/bundle/ruby/2.5.0/gems/pry-0.12.2/lib/pry/commands/shell_command.rb
chess_engine-0.0.2 vendor/bundle/gems/pry-0.12.2/lib/pry/commands/shell_command.rb
chess_engine-0.0.1 vendor/bundle/gems/pry-0.12.2/lib/pry/commands/shell_command.rb
alimentos-alu0100945645-0.1.0 vendor/bundle/ruby/2.3.0/gems/pry-0.12.2/lib/pry/commands/shell_command.rb
alimentos-alu0100945645-1.0.0 vendor/bundle/ruby/2.3.0/gems/pry-0.12.2/lib/pry/commands/shell_command.rb
pry-0.12.2-java lib/pry/commands/shell_command.rb
pry-0.12.2 lib/pry/commands/shell_command.rb
pry-0.12.1 lib/pry/commands/shell_command.rb
pry-0.12.1-java lib/pry/commands/shell_command.rb
pry-0.12.0 lib/pry/commands/shell_command.rb
pry-0.12.0-java lib/pry/commands/shell_command.rb