From 9230bfef0ad3e80d2de6b22d9739162814843cfd Mon Sep 17 00:00:00 2001 From: Anita Undurraga Date: Tue, 30 Jun 2026 20:17:48 -0400 Subject: [PATCH 1/2] fix: add support for ruby 3 --- .../extensions/active_admin_resource.rb | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/buda_active_resource/extensions/active_admin_resource.rb b/lib/buda_active_resource/extensions/active_admin_resource.rb index 7a7126f..c141f18 100644 --- a/lib/buda_active_resource/extensions/active_admin_resource.rb +++ b/lib/buda_active_resource/extensions/active_admin_resource.rb @@ -8,14 +8,16 @@ def process_active_admin_resource_query(_id) find(_id) end - def process_active_admin_collection_query(ransack:, reorder:, page:, per:) + def process_active_admin_collection_query(options = {}, **kwargs) + options = options.merge(kwargs) + collection = find( :all, params: { - search: ransack, - order: reorder, - page: page, - per: per + search: options[:ransack] || {}, + order: options[:reorder], + page: options[:page], + per: options[:per] } ) From 57773da01bb598c37dae4c4f815cdc7b3e1083ce Mon Sep 17 00:00:00 2001 From: Anita Undurraga Date: Tue, 30 Jun 2026 20:18:03 -0400 Subject: [PATCH 2/2] feat: add find each function --- lib/buda_active_resource/base.rb | 34 ++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/lib/buda_active_resource/base.rb b/lib/buda_active_resource/base.rb index 9badd7c..430a927 100644 --- a/lib/buda_active_resource/base.rb +++ b/lib/buda_active_resource/base.rb @@ -1,5 +1,7 @@ module BudaActiveResource class Base < ::ActiveResource::Base + FIND_PER_PAGE = 100 + class << self threadsafe_attribute :_buda_site, :_agent_id, :_agent_secret @@ -62,5 +64,37 @@ def self.polymorphic_name def self.find_by(arg, *_args) find(arg[primary_key]) end + + def self.find_each(params = {}, &block) # rubocop:disable Metrics/MethodLength + return enum_for(__method__, params) unless block + + page = 1 + + loop do + result = retry_on_error error_class: Net::ReadTimeout do + find( + :all, params: { + page: page, + per: FIND_PER_PAGE + }.merge(params) + ) + end + + pagination_info = format.pagination_info + + result.each(&block) + + break if pagination_info['total_pages'] <= page + + page += 1 + end + end + + def self.retry_on_error(retries: 5, error_class: StandardError) + retries -= 1 + yield + rescue error_class + retry unless retries.negative? + end end end