lib/tapioca/compilers/dsl/sidekiq_worker.rb in tapioca-0.4.27 vs lib/tapioca/compilers/dsl/sidekiq_worker.rb in tapioca-0.5.0
- old
+ new
@@ -1,10 +1,8 @@
# typed: strict
# frozen_string_literal: true
-require "parlour"
-
begin
require "sidekiq"
rescue LoadError
return
end
@@ -43,40 +41,55 @@
# end
# ~~~
class SidekiqWorker < Base
extend T::Sig
- sig { override.params(root: Parlour::RbiGenerator::Namespace, constant: T.class_of(::Sidekiq::Worker)).void }
+ sig { override.params(root: RBI::Tree, constant: T.class_of(::Sidekiq::Worker)).void }
def decorate(root, constant)
return unless constant.instance_methods.include?(:perform)
- root.path(constant) do |worker|
+ root.create_path(constant) do |worker|
method_def = constant.instance_method(:perform)
- async_params = compile_method_parameters_to_parlour(method_def)
+ 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_params = [
- Parlour::RbiGenerator::Parameter.new('interval', type: 'T.any(DateTime, Time)'),
+ create_param("interval", type: "T.any(DateTime, Time)"),
*async_params,
]
in_params = [
- Parlour::RbiGenerator::Parameter.new('interval', type: 'Numeric'),
+ create_param("interval", type: "Numeric"),
*async_params,
]
- create_method(worker, 'perform_async', parameters: async_params, return_type: 'String', class_method: true)
- create_method(worker, 'perform_at', parameters: at_params, return_type: 'String', class_method: true)
- create_method(worker, 'perform_in', parameters: in_params, return_type: 'String', class_method: true)
+ generate_perform_method(constant, worker, "perform_async", async_params)
+ generate_perform_method(constant, worker, "perform_at", at_params)
+ generate_perform_method(constant, worker, "perform_in", in_params)
end
end
sig { override.returns(T::Enumerable[Module]) }
def gather_constants
- classes = T.cast(ObjectSpace.each_object(Class), T::Enumerable[Class])
- classes.select { |c| c < Sidekiq::Worker }
+ all_classes.select { |c| c < Sidekiq::Worker }
+ end
+
+ private
+
+ sig do
+ params(
+ constant: T.class_of(::Sidekiq::Worker),
+ worker: RBI::Scope,
+ method_name: String,
+ parameters: T::Array[RBI::TypedParam]
+ ).void
+ end
+ def generate_perform_method(constant, worker, method_name, parameters)
+ if constant.method(method_name.to_sym).owner == Sidekiq::Worker::ClassMethods
+ worker.create_method(method_name, parameters: parameters, return_type: "String", class_method: true)
+ end
end
end
end
end
end