lib/gladys/cli.rb



# frozen_string_literal: true

module Gladys
  class CLI < Thor
    include ActiveSupport::NumberHelper

    def self.exit_on_failure?
      true
    end

    desc "help", "show help"
    def help
      super
      Gladys::Help.message
    end

    desc "cleanup SCRIPT", "cleanup a script"
    option :database_url, type: :string, required: true
    option :debug, type: :boolean, default: false
    option :"option-set", type: :string, default: nil
    def cleanup(script)
      Gladys::Client.load_config(options)
      build_workload(script).cleanup(options)

      say "Done cleaning up #{script}."
    end

    desc "prepare SCRIPT", "prepare a script for benchmarking"
    option :database_url, type: :string, required: true
    option :threads, type: :numeric, default: 1
    option :debug, type: :boolean, default: false
    option :"option-set", type: :string, default: nil
    def prepare(script)
      Gladys::Client.load_config(options)
      report = build_workload(script).prepare(options)

      say "Done preparing #{script} with #{options[:threads]} thread(s)."
      say "Database size: #{number_to_human_size(report.database_size)}"
      say "\t`gladys cleanup #{script}` to clean up the data."
      say "\t`gladys benchmark #{script}` to run the benchmark."
    end

    desc "benchmark SCRIPT", "run a script"
    option :database_url, type: :string, required: true
    option :threads, type: :numeric, default: 1
    option :time, type: :numeric, default: 60
    option :json, type: :boolean, default: false
    option :debug, type: :boolean, default: false
    option :"option-set", type: :string, default: nil
    def benchmark(script)
      Gladys::Client.load_config(options)
      report = build_workload(script).benchmark(options)

      if options[:json]
        say report.build_json
      else
        say report.build_text
      end
    end

    private

    def build_workload(name)
      script = Gladys::Script.load(name, option_set: options[:"option-set"])
      database = Gladys::Database.connect(options[:database_url], threads: options[:threads])

      Gladys::Workload.new(script, database)
    end
  end
end