Class: QueryGuard::CLI::PagedReportFormatter
- Inherits:
-
Object
- Object
- QueryGuard::CLI::PagedReportFormatter
- Defined in:
- lib/query_guard/cli/paged_report_formatter.rb
Overview
Formats QueryGuard reports with pagination support for large finding sets.
When a report has many findings (e.g., thousands), pagination allows:
- Chunking findings into pages for API transmission
- Cursor-based pagination for large datasets
- Memory-efficient processing on receiving end
Example:
# Paginate findings into pages of 100 each
paged = PagedReportFormatter.new(
report: full_report,
page_size: 100,
page: 1
)
json = paged.generate # Returns report with findings[0..99]
Example with cursor:
paged = PagedReportFormatter.new(
report: full_report,
page_size: 100,
continuation_token: 'abc123...'
)
json = paged.generate # Returns next batch of 100 findings
Constant Summary collapse
- DEFAULT_PAGE_SIZE =
100- MAX_PAGE_SIZE =
1000
Instance Method Summary collapse
-
#build_paged_report ⇒ Object
Build the paginated report.
-
#generate ⇒ Object
Generate paginated report Returns: String (JSON).
-
#initialize(report:, page_size: DEFAULT_PAGE_SIZE, page: 1, continuation_token: nil) ⇒ PagedReportFormatter
constructor
A new instance of PagedReportFormatter.
Constructor Details
#initialize(report:, page_size: DEFAULT_PAGE_SIZE, page: 1, continuation_token: nil) ⇒ PagedReportFormatter
Returns a new instance of PagedReportFormatter.
37 38 39 40 41 42 43 |
# File 'lib/query_guard/cli/paged_report_formatter.rb', line 37 def initialize(report:, page_size: DEFAULT_PAGE_SIZE, page: 1, continuation_token: nil) @report = report.dup # Don't mutate original @page_size = [page_size.to_i, MAX_PAGE_SIZE].min @page = [page.to_i, 1].max @continuation_token = continuation_token @all_findings = @report.delete(:findings) || [] end |
Instance Method Details
#build_paged_report ⇒ Object
Build the paginated report
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/query_guard/cli/paged_report_formatter.rb', line 52 def build_paged_report start_index = (@page - 1) * @page_size end_index = start_index + @page_size paginated_findings = @all_findings[start_index...end_index] has_more = end_index < @all_findings.length # Build the report with paginated findings report = @report.dup report[:findings] = paginated_findings # Add pagination metadata report[:pagination] = build_pagination(has_more) # Update summary to match paginated findings only report[:summary] = update_summary(paginated_findings) if report[:summary] report end |
#generate ⇒ Object
Generate paginated report Returns: String (JSON)
47 48 49 |
# File 'lib/query_guard/cli/paged_report_formatter.rb', line 47 def generate JSON.pretty_generate(build_paged_report) end |