Sha256: 539dc7f1c996f62a071103d2e0a1eb493bb78c40ec42e7127dd7c38b6e34f93d

Contents?: true

Size: 1.96 KB

Versions: 25

Compression:

Stored size: 1.96 KB

Contents

require 'open4'

module EY
  module Serverside
    module LoggedOutput

      class Tee
        def initialize(*streams)
          @streams = streams.flatten
        end

        def <<(output)
          @streams.each do |s|
            s << output
            s.flush
          end
          self
        end
      end # Tee

      @@logfile = File.join(ENV['HOME'], 'ey.log')
      def self.logfile=(filename)
        File.unlink filename if File.exist?(filename)  # start fresh
        @@logfile = filename
      end

      def self.logfile
        @@logfile
      end

      @@verbose = false
      def self.verbose=(v)
        @@verbose = !!v
      end

      def self.verbose?
        @@verbose
      end

      def verbose?
        EY::Serverside::LoggedOutput.verbose?
      end

      def warning(msg)
        info "WARNING: #{msg}\n".gsub(/^/,'!> ')
      end

      def info(msg)
        with_logfile do |log|
          Tee.new($stdout, log) << ("#{with_timestamp(msg)}\n")
        end
      end

      def debug(msg)
        with_logfile do |log|
          log << "#{with_timestamp(msg)}\n"
        end
      end

      def logged_system(cmd)
        with_logfile do |log|
          out = verbose? ? Tee.new($stdout, log) : log
          err = Tee.new($stderr, log)    # we always want to see errors

          out <<  with_timestamp(":: running #{cmd}\n")

          # :quiet means don't raise an error on nonzero exit status
          status = Open4.spawn cmd, 0 => '', 1 => out, 2 => err, :quiet => true
          status.exitstatus == 0
        end
      end

      private
      def with_logfile
        File.open(logfile, 'a') {|f| yield f }
      end

      def logfile
        EY::Serverside::LoggedOutput.logfile
      end

      def with_timestamp(msg)
        return msg unless respond_to?(:starting_time)
        time_passed = Time.now.to_i - starting_time.to_i
        timestamp   = "+%2dm %02ds " % time_passed.divmod(60)
        msg.gsub(/^/, timestamp)
      end
    end
  end
end

Version data entries

25 entries across 25 versions & 1 rubygems

Version Path
engineyard-serverside-1.5.32 lib/engineyard-serverside/logged_output.rb
engineyard-serverside-1.5.30 lib/engineyard-serverside/logged_output.rb
engineyard-serverside-1.5.29.pre3 lib/engineyard-serverside/logged_output.rb
engineyard-serverside-1.5.29.pre2 lib/engineyard-serverside/logged_output.rb
engineyard-serverside-1.5.29.pre1 lib/engineyard-serverside/logged_output.rb
engineyard-serverside-1.5.29.pre lib/engineyard-serverside/logged_output.rb
engineyard-serverside-1.5.28 lib/engineyard-serverside/logged_output.rb
engineyard-serverside-1.5.28.pre12 lib/engineyard-serverside/logged_output.rb
engineyard-serverside-1.5.28.pre11 lib/engineyard-serverside/logged_output.rb
engineyard-serverside-1.5.28.pre10 lib/engineyard-serverside/logged_output.rb
engineyard-serverside-1.5.28.pre9 lib/engineyard-serverside/logged_output.rb
engineyard-serverside-1.5.28.pre8 lib/engineyard-serverside/logged_output.rb
engineyard-serverside-1.5.28.pre7 lib/engineyard-serverside/logged_output.rb
engineyard-serverside-1.5.28.pre6 lib/engineyard-serverside/logged_output.rb
engineyard-serverside-1.5.28.pre5 lib/engineyard-serverside/logged_output.rb
engineyard-serverside-1.5.28.pre4 lib/engineyard-serverside/logged_output.rb
engineyard-serverside-1.5.28.pre3 lib/engineyard-serverside/logged_output.rb
engineyard-serverside-1.5.28.pre2 lib/engineyard-serverside/logged_output.rb
engineyard-serverside-1.5.28.pre1 lib/engineyard-serverside/logged_output.rb
engineyard-serverside-1.5.27 lib/engineyard-serverside/logged_output.rb