module AuspostDiagnose
AuspostDiagnose — fetch and explain AusPost tracking parse outcomes for !auspost info. Public: run, explain_payload Depends: AuspostTrack, AuspostScrape, TextUtil Tests: test/lib/auspost_diagnose_test.rb
Public Instance Methods
Source
# File lib/auspost_diagnose.rb, line 71 def describe_parsed_body(body, channel:) payload = JSON.parse(body.to_s) outcome = if AuspostScrape.blocked_response?(payload) "blocked DataDome" else "OK" end { fetch: { channel: channel, outcome: outcome }, payload: payload } rescue JSON::ParserError { fetch: { channel: channel, outcome: "JSON parse error" }, payload: {} } end
Source
# File lib/auspost_diagnose.rb, line 53 def describe_scrape_fetch(raw) if raw.nil? || raw.to_s.strip.empty? return { fetch: { channel: "injected scrape", outcome: "empty" }, payload: {} } end if raw.is_a?(Hash) && raw[:latest_event] return { fetch: { channel: "injected scrape", outcome: "pre-parsed" }, payload: raw } end describe_parsed_body(raw, channel: "injected scrape") end
Source
# File lib/auspost_diagnose.rb, line 29 def explain_payload(payload, tracking_id:) id = AuspostTrack.normalize_tracking_id(tracking_id) || tracking_id.to_s attempts = AuspostScrape.parse_attempts(payload, tracking_id: id) { tracking_id: id, payload: summarize_payload(payload), steps: attempts[:steps], result: attempts[:result] } end
Source
# File lib/auspost_diagnose.rb, line 41 def fetch_raw(tracking_id, fetch: nil) body = AuspostScrape.fetch_via_http(tracking_id, fetch: fetch) if body.nil? || body.to_s.strip.empty? return { fetch: { channel: "HTTP guest API", outcome: "empty or blocked" }, payload: {} } end describe_parsed_body(body, channel: "HTTP guest API") end
Source
# File lib/auspost_diagnose.rb, line 16 def run(tracking_id:, scrape: nil, fetch: nil) id = AuspostTrack.normalize_tracking_id(tracking_id) return { error: "Invalid tracking ID" } unless id fetch_info = if scrape describe_scrape_fetch(scrape.call(id)) else fetch_raw(id, fetch: fetch) end explain_payload(fetch_info[:payload], tracking_id: id).merge(fetch: fetch_info[:fetch]) end
Source
# File lib/auspost_diagnose.rb, line 89 def summarize_payload(payload) return { type: "nil", keys: [] } if payload.nil? if payload.is_a?(Hash) && payload[:latest_event] return { type: "Hash", keys: %w[pre-parsed tracking result] } end if payload.is_a?(Hash) keys = payload.keys.map(&:to_s) return { type: "Hash", keys: keys } end if payload.is_a?(Array) return { type: "Array", keys: ["#{payload.length} entries"] } end { type: payload.class.name, keys: [] } end