Module: Html2rss::Batch
- Defined in:
- lib/html2rss/batch.rb
Overview
Concurrency-bounded batch execution over enumerables with input order preservation and per-item error isolation.
Defined Under Namespace
Classes: BatchResult
Constant Summary collapse
- MAX_CONCURRENCY =
Maximum permitted worker threads for batch operations.
10- DEFAULT_CONCURRENCY =
Default worker threads for batch operations.
5
Class Method Summary collapse
-
.batch_inspect(urls:, strategy: :auto, concurrency: DEFAULT_CONCURRENCY) ⇒ BatchResult
Inspects multiple URLs in parallel with per-URL error isolation.
-
.batch_recon(urls:, strategy: :auto, concurrency: DEFAULT_CONCURRENCY) ⇒ BatchResult
Runs recon across multiple URLs in parallel with per-URL error isolation.
-
.batch_scrape(urls:, strategy: :auto, limit: 10, concurrency: DEFAULT_CONCURRENCY) ⇒ BatchResult
Scrapes multiple URLs in parallel with per-URL error isolation.
-
.map(items, concurrency: DEFAULT_CONCURRENCY) {|item| ... } ⇒ Array<Object>
Executes a block concurrently across items using a bounded worker pool.
-
.run(items, concurrency: DEFAULT_CONCURRENCY) {|item| ... } ⇒ BatchResult
Runs a batch operation that yields items and wraps the results in a BatchResult.
-
.scrape_wire(url:, strategy:, limit:, items_selector: nil) ⇒ Hash{Symbol => Object}
Single-URL scrape wire extraction: auto_feed_result → JSON Feed items.
Class Method Details
.batch_inspect(urls:, strategy: :auto, concurrency: DEFAULT_CONCURRENCY) ⇒ BatchResult
Inspects multiple URLs in parallel with per-URL error isolation.
95 96 97 98 99 100 101 |
# File 'lib/html2rss/batch.rb', line 95 def batch_inspect(urls:, strategy: :auto, concurrency: DEFAULT_CONCURRENCY) reports = PageRecon::Diagnostics.batch(urls:, strategy:, concurrency:) results = reports.map(&:to_wire_h) successful = reports.count { |report| diagnostic_success?(report) } BatchResult.new(total: results.size, successful:, results:) end |
.batch_recon(urls:, strategy: :auto, concurrency: DEFAULT_CONCURRENCY) ⇒ BatchResult
Runs recon across multiple URLs in parallel with per-URL error isolation.
111 112 113 114 115 |
# File 'lib/html2rss/batch.rb', line 111 def batch_recon(urls:, strategy: :auto, concurrency: DEFAULT_CONCURRENCY, **) results = Recon.batch(urls, strategy: (strategy || :auto).to_sym, max_threads: concurrency, **) successful = results.count { |r| r.status ? r.status < 400 : false } BatchResult.new(total: results.size, successful:, results: results.map(&:to_h)) end |
.batch_scrape(urls:, strategy: :auto, limit: 10, concurrency: DEFAULT_CONCURRENCY) ⇒ BatchResult
Scrapes multiple URLs in parallel with per-URL error isolation.
84 85 86 |
# File 'lib/html2rss/batch.rb', line 84 def batch_scrape(urls:, strategy: :auto, limit: 10, concurrency: DEFAULT_CONCURRENCY) run(urls, concurrency:) { |url| scrape_single_url(url:, strategy:, limit:) } end |
.map(items, concurrency: DEFAULT_CONCURRENCY) {|item| ... } ⇒ Array<Object>
Executes a block concurrently across items using a bounded worker pool. Results are returned in input order.
31 32 33 34 35 36 37 |
# File 'lib/html2rss/batch.rb', line 31 def map(items, concurrency: DEFAULT_CONCURRENCY, &) list = Array(items) return [] if list.empty? worker_count = worker_pool_size(list.size, concurrency) process_queue(list, worker_count, &) end |
.run(items, concurrency: DEFAULT_CONCURRENCY) {|item| ... } ⇒ BatchResult
Runs a batch operation that yields items and wraps the results in a BatchResult.
46 47 48 49 50 51 52 |
# File 'lib/html2rss/batch.rb', line 46 def run(items, concurrency: DEFAULT_CONCURRENCY, &) list = Array(items) results = map(list, concurrency:, &) successful = results.count { |entry| entry.is_a?(Hash) ? entry[:ok] : !entry.nil? } BatchResult.new(total: list.size, successful:, results:) end |
.scrape_wire(url:, strategy:, limit:, items_selector: nil) ⇒ Hash{Symbol => Object}
Single-URL scrape wire extraction: auto_feed_result → JSON Feed items.
62 63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/html2rss/batch.rb', line 62 def scrape_wire(url:, strategy:, limit:, items_selector: nil) # rubocop:disable Metrics/MethodLength plan = (strategy || :auto).to_sym feed_args = { strategy: plan, limit: } feed_args[:items_selector] = items_selector unless items_selector.nil? feed_result = Html2rss.auto_feed_result(url, **feed_args) feed = feed_result.to_json_feed { strategy: plan, items: feed[:items] || [], channel_title: feed[:title], admission_drops: feed_result.status.admission_drops } end |