lib/yuuki/caller.rb in yuuki-0.1.2 vs lib/yuuki/caller.rb in yuuki-0.1.3

- old
+ new

@@ -3,74 +3,98 @@ require 'set' require 'yuuki/runner' module Yuuki class Caller + # requires all the rb files in the given directory + # @param [String] require_dir directory + # @param [Boolean] recursive def self.require_dir(require_dir, recursive: false) Dir.glob(recursive ? "#{require_dir}/**/*.rb" : "#{require_dir}/*.rb"){|file| require file} end + # @param [Object] instances def initialize(*instances) @instances = Set.new @threads = [] add(*instances) end + # adds instances to yuuki + # @param [Object] instances def add(*instances) instances.each do |instance| # create instance if class is given if instance.is_a?(Class) klass = instance - instance = instance.new + # check the klass is extended + raise Yuuki::Error, 'Runner instance must be extend Yuuki::Runner' unless klass.singleton_class.include?(Yuuki::Runner) + instance = instance.allocate + instance.instance_variable_set(:@yuuki, self) + instance.send(:initialize) else - klass = instance.class + # check the klass is extended + raise Yuuki::Error, 'Runner instance must be extend Yuuki::Runner' unless instance.class.singleton_class.include?(Yuuki::Runner) + # add @yuuki to the instance + instance.instance_variable_set(:@yuuki, self) end - # check the klass is extended - raise Yuuki::Error, 'Runner instance must be extend Yuuki::Runner' unless klass.singleton_class.include?(Yuuki::Runner) - - # add @yuuki to the instance - instance.instance_variable_set(:@yuuki, self) - # regist @instances << instance end end + # returns runners + # @return [Array<[Method, Hash<Symbol, Object>]>] def runners list = @instances.flat_map do |instance| methods = instance.class.instance_variable_get(:@yuuki_methods) methods.select{|_sig, meta| meta[:enabled]}.map{|sig, meta| [instance.method(sig), meta]} end list.sort_by{|_method, meta| -(meta[:priority] || 0)} end + # runs all methods + # @param [Object] args arguments def run(**args, &block) run_internal(runners, args, &block) end + # runs all selected methods + # @param [Proc] proc_select + # @param [Object] args arguments def run_select(proc_select, **args, &block) run_internal(runners.select(&proc_select), args, &block) end + # runs all methods with the specified tags + # @param [Symbol] tags + # @param [Object] args arguments def run_tag(*tags, **args, &block) run_select(proc{|_method, meta| meta[:tags]&.intersect?(tags)}, **args, &block) end + # runs the specific method + # @param [Class, nil] klass + # @param [Symbol, nil] method_sig method name + # @param [Object] args arguments def run_method(klass, method_sig, **args, &block) select_proc = proc do |method, _meta| flag_klass = klass ? method.receiver.instance_of?(klass) : true flag_method = method_sig ? method.name == method_sig : true flag_klass && flag_method end run_select(select_proc, **args, &block) end + # joins all runnning threads def join @threads.each(&:join) @threads.select!(&:alive?) end + # returns whether any thread is alive + # @return [Boolean] def alive? @threads.select!(&:alive?) !@threads.empty? end alias running? alive?