Class: Tapioca::Dsl::Compilers::SidekiqWorker

Inherits:
Tapioca::Dsl::Compiler show all
Extended by:
T::Sig
Defined in:
lib/tapioca/dsl/compilers/sidekiq_worker.rb

Overview

‘Tapioca::Dsl::Compilers::SidekiqWorker` generates RBI files classes that include [`Sidekiq::Worker`](github.com/mperham/sidekiq/wiki/Getting-Started).

For example, with the following class that includes ‘Sidekiq::Worker`:

~~~rb class NotifierWorker

include Sidekiq::Worker
def perform(customer_id)
  # ...
end

end ~~~

this compiler will produce the RBI file ‘notifier_worker.rbi` with the following content:

~~~rbi # notifier_worker.rbi # typed: true class NotifierWorker

sig { params(customer_id: T.untyped).returns(String) }
def self.perform_async(customer_id); end

sig { params(interval: T.any(DateTime, Time), customer_id: T.untyped).returns(String) }
def self.perform_at(interval, customer_id); end

sig { params(interval: Numeric, customer_id: T.untyped).returns(String) }
def self.perform_in(interval, customer_id); end

end ~~~

If your project uses ‘ActiveSupport` as well, then the compiler will automatically add its classes as accepted values for the `interval` parameter:

  • ‘self.perform_at` will also accept a `ActiveSupport::TimeWithZone` value

  • ‘self.perform_in` will also accept a `ActiveSupport::Duration` value

: [ConstantType = singleton(::Sidekiq::Worker)]

Constant Summary

Constants included from Runtime::Reflection

Runtime::Reflection::ANCESTORS_METHOD, Runtime::Reflection::CLASS_METHOD, Runtime::Reflection::CONSTANTS_METHOD, Runtime::Reflection::EQUAL_METHOD, Runtime::Reflection::METHOD_METHOD, Runtime::Reflection::NAME_METHOD, Runtime::Reflection::OBJECT_ID_METHOD, Runtime::Reflection::PRIVATE_INSTANCE_METHODS_METHOD, Runtime::Reflection::PROTECTED_INSTANCE_METHODS_METHOD, Runtime::Reflection::PUBLIC_INSTANCE_METHODS_METHOD, Runtime::Reflection::REQUIRED_FROM_LABELS, Runtime::Reflection::SINGLETON_CLASS_METHOD, Runtime::Reflection::SUPERCLASS_METHOD, Runtime::Reflection::SignatureBlockError, Runtime::Reflection::UNDEFINED_CONSTANT

Constants included from SorbetHelper

SorbetHelper::FEATURE_REQUIREMENTS, SorbetHelper::SORBET_BIN, SorbetHelper::SORBET_EXE_PATH_ENV_VAR, SorbetHelper::SORBET_GEM_SPEC, SorbetHelper::SORBET_PAYLOAD_URL, SorbetHelper::SPOOM_CONTEXT

Instance Attribute Summary

Attributes inherited from Tapioca::Dsl::Compiler

#constant, #options, #root

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Tapioca::Dsl::Compiler

#add_error, #compiler_enabled?, handles?, #initialize, processable_constants, requested_constants=, reset_state

Methods included from Runtime::Reflection

#abstract_type_of, #ancestors_of, #are_equal?, #class_of, #const_source_location, #constant_defined?, #constantize, #constants_of, #descendants_of, #file_candidates_for, #final_module?, #inherited_ancestors_of, #method_of, #name_of, #name_of_type, #object_id_of, #private_instance_methods_of, #protected_instance_methods_of, #public_instance_methods_of, #qualified_name_of, #resolve_loc, #sealed_module?, #signature_of, #signature_of!, #singleton_class_of, #superclass_of

Methods included from Runtime::AttachedClassOf

#attached_class_of

Methods included from RBIHelper

#as_nilable_type, #as_non_nilable_type, #create_block_param, #create_kw_opt_param, #create_kw_param, #create_kw_rest_param, #create_opt_param, #create_param, #create_rest_param, #create_typed_param, #sanitize_signature_types, serialize_type_variable, #valid_method_name?, #valid_parameter_name?

Methods included from SorbetHelper

#sorbet, #sorbet_path, #sorbet_supports?

Constructor Details

This class inherits a constructor from Tapioca::Dsl::Compiler

Class Method Details

.gather_constantsObject



91
92
93
# File 'lib/tapioca/dsl/compilers/sidekiq_worker.rb', line 91

def gather_constants
  all_classes.select { |c| Sidekiq::Worker > c }
end

Instance Method Details

#decorateObject

: -> void



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/tapioca/dsl/compilers/sidekiq_worker.rb', line 50

def decorate
  return unless constant.instance_methods.include?(:perform)

  root.create_path(constant) do |worker|
    method_def = constant.instance_method(:perform)

    async_params = compile_method_parameters_to_rbi(method_def)

    # `perform_at` and is just an alias for `perform_in` so both methods technically
    # accept a datetime, time, or numeric but we're typing them differently so they
    # semantically make sense.
    at_return_type = if defined?(ActiveSupport::TimeWithZone)
      "T.any(DateTime, Time, ActiveSupport::TimeWithZone)"
    else
      "T.any(DateTime, Time)"
    end
    at_params = [
      create_param("interval", type: at_return_type),
      *async_params,
    ]
    in_return_type = if defined?(ActiveSupport::Duration)
      "T.any(Numeric, ActiveSupport::Duration)"
    else
      "Numeric"
    end
    in_params = [
      create_param("interval", type: in_return_type),
      *async_params,
    ]

    generate_perform_method(worker, "perform_async", async_params)
    generate_perform_method(worker, "perform_at", at_params)
    generate_perform_method(worker, "perform_in", in_params)
  end
end