Class: Html2rss::PageRecon

Inherits:
Object
  • Object
show all
Defined in:
lib/html2rss/page_recon.rb

Overview

Shared page recon for MCP Inspect and FeedResolution probes.

Owns surface class, native feed hints, segment stats, and a cheap AutoSource article count — not request strategy selection or MCP next-step policy.

Defined Under Namespace

Classes: Assessment, Result

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(response:, url:) ⇒ PageRecon

Returns a new instance of PageRecon.

Parameters:



110
111
112
113
# File 'lib/html2rss/page_recon.rb', line 110

def initialize(response:, url:)
  @response = response
  @url = url
end

Class Method Details

.assess(response:, url:) ⇒ Assessment

Cheap page assessment for policy gates and probe scoring (fixed AutoSource limit).

Parameters:

Returns:



82
83
84
# File 'lib/html2rss/page_recon.rb', line 82

def self.assess(response:, url:)
  new(response:, url:).assess
end

.call(response:, url:, strategy: nil) ⇒ Result

Parameters:

Returns:



72
73
74
# File 'lib/html2rss/page_recon.rb', line 72

def self.call(response:, url:, strategy: nil) # rubocop:disable Lint/UnusedMethodArgument
  new(response:, url:).call
end

.discover_segments(sst, url) ⇒ Array

Parameters:

Returns:

  • (Array)


100
101
102
103
104
105
# File 'lib/html2rss/page_recon.rb', line 100

def self.discover_segments(sst, url)
  link_resolver = Scoring::LinkResolver.new(url)
  AutoSource::Segmenter.call(sst, base_url: url, strategy: :list, link_resolver:)
rescue StandardError
  []
end

.surface_category_for(response:, url:) ⇒ Symbol

Surface class only — no AutoSource extract (for empty-extract error labels).

Parameters:

Returns:

  • (Symbol)


92
93
94
# File 'lib/html2rss/page_recon.rb', line 92

def self.surface_category_for(response:, url:)
  new(response:, url:).surface_category_for
end

Instance Method Details

#assessAssessment

Returns:



117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/html2rss/page_recon.rb', line 117

def assess
  return feed_assessment if response.feed_response?

  parsed = html_parsed_body
  articles_count, admission_drops = cheap_articles
  Assessment.new(
    surface_category: surface_category(parsed),
    articles_count:,
    admission_drops:,
    html_response: true
  )
end

#callResult

Returns:



140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
# File 'lib/html2rss/page_recon.rb', line 140

def call # rubocop:disable Metrics/AbcSize, Metrics/MethodLength -- assemble recon Result
  requested = Url.from_absolute(url)
  final = response.url
  parsed = html_parsed_body
  assessment = assess
  sst_payload, segment_stats = sst_payload_and_segments(requested)

  Result.new(
    requested_url: requested.to_s,
    final_url: final.to_s,
    status: response.status,
    scheme_downgrade: scheme_downgrade?(requested, final),
    alternate_feeds: alternate_feeds_from(parsed),
    surface_category: assessment.surface_category,
    articles_count: assessment.articles_count,
    admission_drops: assessment.admission_drops,
    segment_stats:,
    html_response: response.html_response?,
    content_type: response.content_type,
    blocked_surface: blocked_surface_key,
    sst: sst_payload
  )
end

#surface_category_forSymbol

Returns:

  • (Symbol)


132
133
134
135
136
# File 'lib/html2rss/page_recon.rb', line 132

def surface_category_for
  return :unsupported_surface if response.feed_response?

  surface_category(html_parsed_body)
end