Class: Hubeye::Server::Strategy

Inherits:
Object
  • Object
show all
Defined in:
lib/server/hubeye_server.rb

Defined Under Namespace

Classes: AddHook, AddRepo, Exit, ListHooks, ListTracking, LoadHook, LoadRepo, Next, RmRepo, SaveHook, SaveRepo, Shutdown

Constant Summary collapse

UnknownStrategy =
Class.new(StandardError)
STRATEGY_CLASSES =
[ "Shutdown", "Exit", "SaveHook", "SaveRepo",
"LoadHook", "LoadRepo", "AddHook", "ListHooks", "ListTracking",
"Next", "RmRepo", "AddRepo" ]
STRATEGIES =

STRATEGIES hash

keys: input matches OR lambda {|input| input.something?} => value

values: lambda {|matchdata, basestrategy| SomeStrategy.new(matchdata, basestrategy)}

{
  %r{\Ashutdown\Z} => lambda {|m, s| Shutdown.new(m, s)},
  %r{\Aquit|exit\Z} => lambda {|m, s| Exit.new(m, s)},
  %r{\A\s*save hook(s?) as (.+)\Z} => lambda {|m, s| SaveHook.new(m, s)},
  %r{\A\s*save repo(s?) as (.+)\Z} => lambda {|m, s| SaveRepo.new(m, s)},
  %r{\A\s*load hook(s?) (.+)\Z} => lambda {|m, s| LoadHook.new(m, s)},
  %r{\A\s*load repo(s?) (.+)\Z} => lambda {|m, s| LoadRepo.new(m, s)},
  %r{\A\s*internal load hook(s?) (.+)\Z} => lambda {|m, s| LoadHook.new(m, s, :internal => true)},
  %r{\A\s*internal load repo(s?) (.+)\Z} => lambda {|m, s| LoadRepo.new(m, s, :internal => true)},
  %r{\Ahook add ([-\w]+/[-\w]+) (dir:\s?(.*))?\s*cmd:\s?(.*)\Z} => lambda {|m, s| AddHook.new(m, s)},
  %r{\Ahook list\Z} => lambda {|m, s| ListHooks.new(m, s)},
  %r{\Atracking\s*\Z} => lambda {|m, s| ListTracking.new(m, s)},
  %r{\Atracking\s*-d\Z} => lambda {|m, s| ListTracking.new(m, s, :details => true)},
  %r{^pwd} => lambda {|m, s| AddRepo.new(m, s, :pwd => true)},
  %r{^\s*$} => lambda {|m, s| Next.new(m, s)},
  %r{\Arm ([-\w]+/?[-\w]*)\Z} => lambda {|m, s| RmRepo.new(m, s)},
  lambda {|inp| inp.include? '/'} => lambda {|m, s| AddRepo.new(m, s, :fullpath => true)},
  lambda {|inp| not inp.nil?} => lambda {|m, s| AddRepo.new(m, s)}
}

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(server, options = {}) ⇒ Strategy

Returns a new instance of Strategy.



110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/server/hubeye_server.rb', line 110

def initialize(server, options={})
  @server = server
  opts = {:internal_input => nil}.merge options
  if !opts[:internal_input]
    @input = server.socket.gets
    # check if the client pressed ^C or ^D
    if @input.nil?
      @server.remote_connection = false
      throw(:invalid_input)
    end
    @input.chop!
  else
    @input = opts[:internal_input]
  end
  unless @input
    Logger.log "Client on #{@server.socket.peeraddr[2]} disconnected."
    @server.sockets.delete(socket)
    @server.socket.close
    return
  end
  @input = @input.strip.downcase
  @input.gsub! /diiv/, '/'
end

Instance Attribute Details

#inputObject (readonly)

Returns the value of attribute input.



108
109
110
# File 'lib/server/hubeye_server.rb', line 108

def input
  @input
end

#serverObject (readonly)

Returns the value of attribute server.



108
109
110
# File 'lib/server/hubeye_server.rb', line 108

def server
  @server
end

Instance Method Details

#callObject

Raises:



468
469
470
471
472
473
474
475
476
477
478
479
480
481
# File 'lib/server/hubeye_server.rb', line 468

def call
  STRATEGIES.each do |inp,strat|
    if inp.respond_to? :match
      if m = @input.match(inp)
        return strat.call(m, self)
      end
    elsif inp.respond_to? :call
      if m = inp.call(@input)
        return strat.call(m, self)
      end
    end
  end
  raise UnknownStrategy
end