module Travis::API::V3 class Query @@sidekiq_cache = Tool::ThreadLocal.new # generate from eval to avoid additional string allocations on every params access @@params_accessor = <<-RUBY attr_writer :%s def %s return @%s if defined? @%s return @%s = @params['%s.%s'.freeze] if @params.include? '%s.%s'.freeze return @%s = @params['%s'.freeze]['%s'.freeze] if @params.include? '%s'.freeze and @params['%s'.freeze].is_a? Hash return @%s = @params['%s'.freeze] if (@params['@type'.freeze] || @main_type) == '%s'.freeze @%s = nil end def %s! %s or raise WrongParams, 'missing %s.%s'.freeze end RUBY def self.params(*list, prefix: nil) prefix ||= name[/[^:]+$/].underscore list.each { |e| class_eval(@@params_accessor % { name: e, prefix: prefix }) } end attr_reader :params, :main_type def initialize(params, main_type) @params = params @main_type = main_type.to_s end def perform_async(identifier, *args) class_name, queue = @@sidekiq_cache[identifier] ||= [ "Travis::Sidekiq::#{identifier.to_s.camelcase}".freeze, identifier.to_s.pluralize.freeze ] ::Sidekiq::Client.push('queue'.freeze => queue, 'class'.freeze => class_name, 'args'.freeze => args) end def includes?(key) @includes ||= @params['include'.freeze].to_s.split(?,.freeze) @includes.include? key end def bool(value) return false if value == 'false'.freeze !!value end def user_condition(value) case value when String then { login: value } when Integer then { id: value } when Models::User then { id: value.id } else raise WrongParams end end end end