diff --git a/lib/job-iteration/enumerator_builder.rb b/lib/job-iteration/enumerator_builder.rb index 46e2756d..1ebe0020 100644 --- a/lib/job-iteration/enumerator_builder.rb +++ b/lib/job-iteration/enumerator_builder.rb @@ -181,6 +181,32 @@ def build_nested_enumerator(enums, cursor:) NestedEnumerator.new(enums, cursor: cursor).each end + # Builds Enumerator for while loop iteration. + # + # @yield Condition to be evaluated before each iteration, the iteration is allowed if a true value is returned. + # + # @example + # def build_enumerator(params) + # enumerator_builder.while query_model_xyz(params).exists? + # end + # + # def each_iteration(count, params) + # query_model_xyz(params).limit(1000).delete_all + # end + # + # def query_model_xyz(params) + # Xyz.where(owner_id: params[:owner_id]) + # end + # + def build_while_enumerator(&condition) + count = 0 + enum = Enumerator.new do |yielder| + yielder << count++ while condition.call + end + + wrap(enum) + end + alias_method :once, :build_once_enumerator alias_method :times, :build_times_enumerator alias_method :array, :build_array_enumerator @@ -190,6 +216,7 @@ def build_nested_enumerator(enums, cursor:) alias_method :throttle, :build_throttle_enumerator alias_method :csv, :build_csv_enumerator alias_method :nested, :build_nested_enumerator + alias_method :while, :build_while_enumerator private diff --git a/test/unit/enumerator_builder_test.rb b/test/unit/enumerator_builder_test.rb index ecb9977f..d853b37c 100644 --- a/test/unit/enumerator_builder_test.rb +++ b/test/unit/enumerator_builder_test.rb @@ -74,6 +74,13 @@ class EnumeratorBuilderTest < ActiveSupport::TestCase ) end + test_builder_method(:build_while_enumerator) do + count = 0 + enumerator_builder(wraps: 3).build_while_enumerator do + count < 3 ? (count += 1) : false + end + end + # checks that all the non-alias methods were tested raise "methods not tested: #{methods.inspect}" unless methods.empty?