class CommandLine::SubCommands::SubmitCommand

Public Class Methods

new(new_args, new_input_stream = STDIN) click to toggle source
Calls superclass method CommandLine::Command::new
# File lib/git/contest/command_line/sub_commands/submit_command.rb, line 15
def initialize(new_args, new_input_stream = STDIN)
  super

  # load sites
  $config = get_config() || {}
  $sites  = {}
  if $config.has_key? 'sites'
    $sites = $config["sites"]
  end

  # load drivers
  Contest::Driver::Utils.load_plugins

  $drivers = {}
  load_drivers
end

Public Instance Methods

define_options() click to toggle source
# File lib/git/contest/command_line/sub_commands/submit_command.rb, line 32
def define_options
  opt_parser.on "-h", "--help", "help" do
    usage
    exit 0
  end
end
run() click to toggle source
# File lib/git/contest/command_line/sub_commands/submit_command.rb, line 42
def run

  # check options
  sub_commands = $sites.keys

  # detect site
  unless has_next_token?
    usage
    exit 0
  end

  site = next_token.strip

  unless $sites.has_key?(site)
    if site != ""
      puts "site not found"
    else
      usage
    end
    exit 0
  end

  # detect driver
  driver_name = $sites[site]["driver"]

  unless $drivers.has_key?(driver_name)
    puts "driver not found"
    exit
  end

  #
  # Submit Start
  #
  driver = $drivers[driver_name].new(args)

  $submit_info = {}

  # set events
  driver.on(
    'start',
    Proc.new do
      puts "@start: submit"
    end
  )

  driver.on(
    'before_login',
    Proc.new do
      puts "@submit: logging in..."
    end
  )

  driver.on(
    'after_login',
    Proc.new do
      puts "@submit: login ok"
    end
  )

  driver.on(
    'before_submit',
    Proc.new do |submit_info|
      $submit_info = submit_info
      puts "@submit: doing..."
    end
  )

  driver.on(
    'after_submit',
    Proc.new do
      puts "@submit: done"
    end
  )

  driver.on(
    'before_wait',
    Proc.new do
      print "@result: waiting..."
    end
  )

  driver.on(
    'retry',
    Proc.new do
      print "."
    end
  )

  driver.on(
    'after_wait',
    Proc.new do |submission_info|
      puts ""
      next unless submission_info.is_a?(Hash)
      puts ""
      puts "@result: Submission Result"
      puts "  %s: %s" % ["submission id", "#{submission_info[:submission_id]}"]
      puts "  %s: %s" % ["status", "#{submission_info[:status]}"]
      puts ""
      if Git.contest_is_initialized
        puts "@commit"
        Git.do "add #{get_git_add_target($config["submit_rules"]["add"] || ".")}"
        Git.do "commit --allow-empty -m \"#{submission_info[:result]}\""
      end
    end
  )

  driver.on(
    'finish',
    Proc.new do
      puts "@finish"
    end
  )

  # global config
  $config["submit_rules"] ||= {}
  $config["file"] ||= {}

  # set config
  driver.config = $sites[site]
  driver.config.merge! $config

  # parse driver options
  driver.options = driver.get_opts()

  result = driver.submit()

end
set_default_options() click to toggle source
# File lib/git/contest/command_line/sub_commands/submit_command.rb, line 39
def set_default_options
end

Private Instance Methods

get_banner() click to toggle source
# File lib/git/contest/command_line/sub_commands/submit_command.rb, line 192
def get_banner
  res = ""
  res += "usage: git contest submit <site>\n"
  res += "\n"
  res += "Available sites are:\n"
  $sites.keys().each do |site|
    if $drivers.has_key? $sites[site]["driver"]
      driver = $drivers[$sites[site]["driver"]].new
      res += "  %-12s\t#{driver.get_desc}\n" % [site]
    else
      # TODO: driver not found
    end
  end
  res += "\n"
  res += "Try 'git contest submit <site> --help' for details.\n"
  return res
end
get_git_add_target(rule) click to toggle source
# File lib/git/contest/command_line/sub_commands/submit_command.rb, line 210
def get_git_add_target rule
  str = rule
  str = str.gsub('${source}', $submit_info[:source])
  str
end
load_drivers() click to toggle source

Load Drivers

# File lib/git/contest/command_line/sub_commands/submit_command.rb, line 174
def load_drivers
  driver_names = $sites.keys().map {|key| $sites[key]["driver"] }
  driver_names.uniq.each do |driver_name|
    class_name = driver_name.clone
    class_name.gsub!(/^[a-z]/) {|c| c.upcase }
    class_name.gsub!(/(_)([a-z])/) {|c, b| $2.upcase }
    $drivers[driver_name] = Contest::Driver.const_get "#{class_name}Driver"
  end
end
usage() click to toggle source

Command Utils

# File lib/git/contest/command_line/sub_commands/submit_command.rb, line 187
def usage
  puts get_banner
  return 0
end