sh19910711/git-contest

View on GitHub
lib/contest/driver/base.rb

Summary

Maintainability
A
1 hr
Test Coverage
#
# base.rb
#
# Copyright (c) 2013-2014 Hiroyuki Sano <sh19910711 at gmail.com>
# Licensed under the MIT-License.
#

require 'contest/driver/common'
require 'rexml/document'
require 'contest/driver/driver_event'

module Contest
  module Driver
    DEFAULT_SOURCE_PATH = "main.*"
    DEFAULT_COMMIT_MESSAGE ="${site} ${problem-id}: ${status}"

    class DriverBase < DriverEvent
      attr_accessor :config
      attr_accessor :options
      attr_reader :args

      def initialize(new_args = [])
        @args = new_args.clone
        # submit options
        @options ||= {}
        # site config
        @config ||= {}
        @config["file"] ||= {}
        @config["submit_rules"] ||= {}
        # call DriverEvent#initialize
        super()
        initialize_ext
      end
      
      def initialize_ext
        nil
      end

      def get_opts_ext
        # Example:
        # define_options do
        #   opt(
        #     :problem_id,
        #     "Problem ID (Ex: 1000, 123, 0123, etc...)",
        #     :type => :string,
        #     :required => true,
        #   )
        # end
        raise 'TODO: Implement'
      end

      def get_site_name
        raise 'TODO: Implement'
      end

      def get_problem_id(options)
        raise 'TODO: Implement'
      end

      def resolve_language(label)
        raise 'TODO: Implement'
      end

      def submit_ext(config, source_path, options)
        raise 'TODO: Implement'
      end

      def get_desc
        ''
      end

      def define_options &block
        @blocks ||= []
        @blocks.push(block)
      end

      def get_opts
        get_opts_ext()
        define_options do
          opt(
            :source,
            "Specify submitted code (Ex: main.cpp)",
            :type => :string,
            :required => false,
          )
          opt(
            :language,
            "Specify programming language (Ex: C++, Java or etc...)",
            :type => :string,
            :required => false,
          )
          opt(
            :message,
            "Set git-commit message",
            :type => :string,
            :required => false,
          )
        end
        Trollop::options args, @blocks do |blocks|
          version "git-contest driver"
          # set driver options
          blocks.each do |b|
            instance_eval &b
          end
        end
      end

      def get_commit_message_ext
        nil
      end

      def get_commit_message status
        if @options[:message].nil?
          message = @config["submit_rules"]["message"] || DEFAULT_COMMIT_MESSAGE
          message = message.gsub '${site}', get_site_name
          message = message.gsub '${problem-id}', get_problem_id(options)
          message = message.gsub '${status}', status
          message = "\n#{get_commit_message_ext}" unless get_commit_message_ext.nil?
        else
          message = @options[:message]
        end
        message
      end

      # submit a solution
      def submit
        @options[:source] = Utils.resolve_path(
          @options[:source] || @config["submit_rules"]["source"] || DEFAULT_SOURCE_PATH
        )
        if Utils.check_file_map(@options[:source], @config["file"]["ext"])
          @options[:language] ||= Utils.resolve_file_map(@options[:source], @config["file"]["ext"])
        else
          @options[:language] ||= Utils.resolve_language(@options[:source])
        end
        @options[:language] = resolve_language Utils.normalize_language(@options[:language])

        submit_ext()
      end
    end
  end
end