FitnessKeeper/leeroy

View on GitHub
lib/leeroy/helpers/state.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'fcntl'
require 'multi_json'

require 'leeroy/helpers'

module Leeroy
  module Helpers
    module State
      include Leeroy::Helpers

      attr_accessor :state

      def state_from_pipe(state = {}, global_options = self.global_options)
        begin
          state.merge(load_state)

        rescue StandardError => e
          raise e
        end
      end

      def load_state
        begin
          logger.debug "loading state from stdin if available"

          _stdin? ?  MultiJson.load($stdin.read, :symbolize_keys => true) : {}

        rescue StandardError => e
          raise e
        end
      end

      def dump_state
        logger.debug "dumping state to stdout"
        $stdout.puts self.state.dump
      end

      def rotate_task_metadata
        logger.debug "rotating task metadata"
        if self.state.metadata.task?
          self.state.metadata.previous = self.state.metadata.task
        end
        self.state.metadata.task = self.class.to_s
      end

      def to_s
        "#{self.metadata},#{self.data}"
      end

      private

      # this is preposterous BS and doubtless not portable to Windows
      def _stdin?
        $stdin.fcntl(Fcntl::F_GETFL, 0) == 0
      end

    end
  end
end