Sha256: 1156eaaa69667d2c5441abe2ddbdc6d01a240e9530323d27d0927b811a3668de

Contents?: true

Size: 1.58 KB

Versions: 15

Compression:

Stored size: 1.58 KB

Contents

require "open3"
require "geny/error"

module Geny
  module Actions
    # Utilities for executing shell commands
    class Shell
      # Create a new shell
      # @param ui [UI]
      def initialize(ui:)
        @ui = ui
      end

      # Run a shell command and return it's output
      # @raise [ExitError] when the command exits with a non-zero status
      # @return [String]
      #
      # @example
      #   shell.capture("echo", "hello") #=> "hello"
      def capture(*args, **opts)
        cmd = build_command(*args, **opts)
        cmd_str = stringify_command(args)
        out, _err, status = Open3.capture3(*cmd)
        assert_success!(status, cmd_str)
        out.chomp
      rescue Errno::ENOENT
        raise ExitError.new(command: cmd_str, code: 127)
      end

      # Run a shell command
      # @raise [ExitError] when the command exits with a non-zero status
      #
      # @example
      #   shell.capture("echo", "hello") # prints "hello"
      def run(*args, verbose: true, **opts)
        cmd = build_command(*args, **opts)
        cmd_str = stringify_command(args)

        @ui.status("run", cmd_str) if verbose

        Kernel.system(*cmd)
        assert_success!($?, cmd_str)
      end

      private

      def build_command(*args, env: nil, **opts)
        [*env, *args, **opts]
      end

      def stringify_command(args)
        args.map { |arg| arg.match?(/\s/) ? arg.inspect : arg }.join(" ")
      end

      def assert_success!(status, cmd)
        unless status.success?
          raise ExitError.new(command: cmd, code: status.exitstatus)
        end
      end
    end
  end
end

Version data entries

15 entries across 15 versions & 1 rubygems

Version Path
geny-2.5.2 lib/geny/actions/shell.rb
geny-2.5.1 lib/geny/actions/shell.rb
geny-2.5.0 lib/geny/actions/shell.rb
geny-2.4.0 lib/geny/actions/shell.rb
geny-2.3.0 lib/geny/actions/shell.rb
geny-2.2.0 lib/geny/actions/shell.rb
geny-2.1.4 lib/geny/actions/shell.rb
geny-2.1.3 lib/geny/actions/shell.rb
geny-2.1.2 lib/geny/actions/shell.rb
geny-2.1.1 lib/geny/actions/shell.rb
geny-2.1.0 lib/geny/actions/shell.rb
geny-2.0.0 lib/geny/actions/shell.rb
geny-1.0.1 lib/geny/actions/shell.rb
geny-1.0.0 lib/geny/actions/shell.rb
geny-0.1.0 lib/geny/actions/shell.rb