Sha256: c95cfda95546e9ad89ecbc51db3a2d4f71b8cc3c3dacbf165f9d80f32c4802b7

Contents?: true

Size: 1.31 KB

Versions: 3

Compression:

Stored size: 1.31 KB

Contents

require 'psych'
require 'pathname'
require 'forwardable'

module Canals
  class Session
    include Enumerable
    extend Forwardable

    def initialize
      @session = load_session(session_file)
    end

    def_delegator :@session, :[]

    def each(&block)
      @session.each(&block)
    end

    def empty?
      @session.empty?
    end

    def add(session, save=true)
      @session.push(session)
      save! if save
    end

    def del(name, save=true)
      @session.delete_if{ |s| s[:name] == name }
      save! if save
    end

    def get(session_id)
      case session_id
      when Numeric
        @session.find{ |s| s[:pid] == session_id }
      when String
        @session.find{ |s| s[:name] == session_id }
      end
    end

    def alive?(session_id)
      sess = get(session_id)
      File.exist?(sess[:socket])
    end

    def save!
      FileUtils.mkdir_p(session_file.dirname)
      File.open(session_file, 'w') do |file|
        file.write(Psych.dump(@session))
      end
    end

    private

    def session_file
      file = File.join(Dir.home, '.canals/session')
      Pathname.new(file)
    end

    def load_session(_session_file)
      valid_file = _session_file && _session_file.exist? && !_session_file.size.zero?
      return [] if !valid_file
      return Psych.load_file(_session_file)
    end

  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
canals-0.8.7 lib/canals/session.rb
canals-0.8.6 lib/canals/session.rb
canals-0.8.5 lib/canals/session.rb