class GemeraldBeanstalk::Command

Constants

BAD_FORMAT
COMMANDS
COMMANDS_RECOGNIZED_WITHOUT_SPACE_AFTER_COMMAND
COMMANDS_REQUIRING_SPACE_AFTER_COMMAND
COMMAND_METHOD_NAMES
COMMAND_PARSER_REGEX
TRAILING_SPACE_REGEX
UNKNOWN_COMMAND
VALID_TUBE_NAME_REGEX
WHITE_SPACE_REGEX
ZERO_STRING_REGEX

Attributes

body[RW]
command[R]
connection[R]
error[R]

Public Class Methods

new(raw_command, connection) click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 46
def initialize(raw_command, connection)
  @connection = connection
  parse(raw_command)
end

Public Instance Methods

arguments() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 37
def arguments
  if command == :put
    return @args[0, @argument_cardnality].unshift(connection).push(body)
  else
    return @args[0, @argument_cardnality].unshift(connection)
  end
end
method_name() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 52
def method_name
  return COMMAND_METHOD_NAMES[command]
end
multi_part_request?() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 57
def multi_part_request?
  return command == :put && body.nil?
end
to_s() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 62
def to_s
  return "#{command} #{@args.join(' ')}"
end
valid?() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 67
def valid?
  return @valid
end

Private Instance Methods

bad_format!() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 73
def bad_format!
  invalidate(BAD_FORMAT)
end
bury() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 78
def bury
  @argument_cardnality = 2
  return requires_no_space_after_line &&
  requires_exact_argument_count &&
  requires_valid_integer(@args[0]) &&
  requires_valid_integer(@args[1], :positive => true)
end
delete() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 87
def delete
  @argument_cardnality = 1
  return true
end
ignore() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 93
def ignore
  @argument_cardnality = 1
  return requires_no_space_after_line &&
  requires_exact_argument_count &&
  requires_valid_tube_name(@args[0])
end
invalidate(error) click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 101
def invalidate(error)
  @error = error
  @value = false
end
kick() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 107
def kick
  @argument_cardnality = 1
  return requires(@args[0]) &&
  requires_valid_integer(@args[0], :allow_trailing => true)
end
kick_job() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 114
def kick_job
  @argument_cardnality = 1
  return true
end
list_tube_used() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 126
def list_tube_used
  @argument_cardnality = 0
  return requires_only_command
end
list_tubes() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 120
def list_tubes
  @argument_cardnality = 0
  return requires_only_command
end
list_tubes_watched() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 132
def list_tubes_watched
  @argument_cardnality = 0
  return requires_only_command
end
parse(raw_command) click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 138
def parse(raw_command)
  @command_lines = raw_command.match(COMMAND_PARSER_REGEX)
  if @command_lines.nil?
    return unknown_command!
  end

  @args = @command_lines[:command].split(WHITE_SPACE_REGEX)
  @command = @args.shift.to_sym rescue nil

  @space_after_command = @command && !!(raw_command[@command.length] =~ WHITE_SPACE_REGEX)
  @body = @command_lines[:body]

  return unknown_command! unless valid_command?

  return bad_format! unless send(method_name)
  @valid = true
end
pause_tube() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 157
def pause_tube
  @argument_cardnality = 2
  return requires_no_space_after_line &&
  requires(@args[0]) &&
  requires_valid_integer(@args[1]) &&
  requires_valid_tube_name(@args[0])
end
peek() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 166
def peek
  @argument_cardnality = 1
  return true
end
peek_buried() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 172
def peek_buried
  @argument_cardnality = 0
  return requires_only_command
end
peek_delayed() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 178
def peek_delayed
  @argument_cardnality = 0
  return requires_only_command
end
peek_ready() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 184
def peek_ready
  @argument_cardnality = 0
  return requires_only_command
end
put() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 190
def put
  @argument_cardnality = 5
  return false unless @args.all? do |arg|
    requires_valid_integer(arg, :positive => true)
  end

  # Handle weird case where BAD_FORMAT, but increments stats
  is_valid = requires_no_space_after_line
  unless is_valid
    connection.beanstalk.adjust_stats_cmd_put
  end
  return is_valid
end
quit() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 205
def quit
  @argument_cardnality = 0
  return requires_only_command
end
release() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 211
def release
  @argument_cardnality = 3
  return requires_no_space_after_line &&
  requires_exact_argument_count &&
  requires_valid_integer(@args[0]) &&
  requires_valid_integer(@args[1], :positive => true) &&
  requires_valid_integer(@args[2], :positive => true)
end
requires(arg) click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 221
def requires(arg)
  return true unless arg.nil?

  bad_format!
  return false
end
requires_exact_argument_count() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 229
def requires_exact_argument_count
  return true if @args.length == @argument_cardnality

  bad_format!
  return false
end
requires_no_space_after_command() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 237
def requires_no_space_after_command
  return true unless @space_after_command

  bad_format!
  return false
end
requires_no_space_after_line() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 245
def requires_no_space_after_line
  return true unless @command_lines[:command] =~ TRAILING_SPACE_REGEX

  bad_format!
  return false
end
requires_only_command() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 253
def requires_only_command
  return requires_no_space_after_command && requires_exact_argument_count
end
requires_space_after_command() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 258
def requires_space_after_command
  return true if @space_after_command

  bad_format!
  return false
end
requires_valid_integer(arg, opts = {}) click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 266
def requires_valid_integer(arg, opts = {})
  arg_to_i = arg.to_i
  if opts[:allow_trailing]
    if arg_to_i == 0 && arg !~ ZERO_STRING_REGEX
      bad_format!
      return false
    end
  else
    if arg_to_i.to_s != arg
      bad_format!
      return false
    end
  end

  return true if opts[:positive] ? arg_to_i >= 0 : true

  bad_format!
  return false
end
requires_valid_tube_name(tube_name) click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 287
def requires_valid_tube_name(tube_name)
  return true if valid_tube_name?(tube_name)

  bad_format!
  return false
end
reserve() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 295
def reserve
  @argument_cardnality = 0
  return requires_only_command
end
reserve_with_timeout() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 301
def reserve_with_timeout
  @argument_cardnality = 1
  return requires_space_after_command
end
stats() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 307
def stats
  @argument_cardnality = 0
  return requires_only_command
end
stats_job() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 313
def stats_job
  @argument_cardnality = 1
  return requires_space_after_command
end
stats_tube() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 319
def stats_tube
  @argument_cardnality = 1
  return requires_space_after_command &&
  requires_no_space_after_line &&
  requires_valid_tube_name(@args[0])
end
touch() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 327
def touch
  @argument_cardnality = 1
  return true
end
unknown_command!() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 341
def unknown_command!
  invalidate(UNKNOWN_COMMAND)
end
use() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 333
def use
  @argument_cardnality = 1
  return requires_no_space_after_line &&
  requires_exact_argument_count &&
  requires_valid_tube_name(@args[0])
end
valid_command?() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 346
def valid_command?
  return COMMANDS_RECOGNIZED_WITHOUT_SPACE_AFTER_COMMAND.include?(command) || (
    COMMANDS_REQUIRING_SPACE_AFTER_COMMAND.include?(command) && @space_after_command
  )
end
valid_tube_name?(tube_name) click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 353
def valid_tube_name?(tube_name)
  return !tube_name.nil? && tube_name.bytesize <= 200 && VALID_TUBE_NAME_REGEX =~ tube_name
end
watch() click to toggle source
# File lib/gemerald_beanstalk/command.rb, line 358
def watch
  @argument_cardnality = 1
  return requires_no_space_after_line &&
  requires_exact_argument_count &&
  requires_valid_tube_name(@args[0])
end