fetch_util 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +27 -0
  3. data/lib/fetch_util/assets/extract.js +1 -1
  4. data/lib/fetch_util/browser/site_stabilization/communities/reddit.rb +71 -0
  5. data/lib/fetch_util/browser/site_stabilization/communities.rb +13 -0
  6. data/lib/fetch_util/browser/site_stabilization/{bitbucket_cloud_pull_resource_modules.rb → forges/bitbucket/pulls/resource_modules.rb} +5 -5
  7. data/lib/fetch_util/browser/site_stabilization/{bitbucket_cloud_pull_resources.rb → forges/bitbucket/pulls/resources.rb} +3 -34
  8. data/lib/fetch_util/browser/site_stabilization/{bitbucket_cloud_threads.rb → forges/bitbucket/threads/index.rb} +3 -34
  9. data/lib/fetch_util/browser/site_stabilization/forges/gitea/stabilization.rb +31 -0
  10. data/lib/fetch_util/browser/site_stabilization/forges/observation_state.rb +59 -0
  11. data/lib/fetch_util/browser/site_stabilization/forges.rb +109 -0
  12. data/lib/fetch_util/browser/site_stabilization/marketplaces/ebay.rb +56 -0
  13. data/lib/fetch_util/browser/site_stabilization/marketplaces.rb +13 -0
  14. data/lib/fetch_util/browser/site_stabilization/{facebook_stabilization.rb → social/facebook.rb} +7 -0
  15. data/lib/fetch_util/browser/site_stabilization/{social_platforms.rb → social/instagram.rb} +6 -8
  16. data/lib/fetch_util/browser/site_stabilization/social.rb +15 -0
  17. data/lib/fetch_util/browser/site_stabilization/{travel_and_lodging.rb → travel/lodging.rb} +7 -9
  18. data/lib/fetch_util/browser/site_stabilization/travel.rb +13 -0
  19. data/lib/fetch_util/browser/site_stabilization.rb +10 -97
  20. data/lib/fetch_util/browser/stabilization/page_flow.rb +7 -5
  21. data/lib/fetch_util/browser.rb +3 -0
  22. data/lib/fetch_util/raw_docs_fallback.rb +5 -1
  23. data/lib/fetch_util/regulatory/cache_store.rb +5 -3
  24. data/lib/fetch_util/regulatory/cache_validation.rb +24 -0
  25. data/lib/fetch_util/regulatory/tdm_policy.rb +1 -1
  26. data/lib/fetch_util/regulatory.rb +1 -0
  27. data/lib/fetch_util/version.rb +1 -1
  28. metadata +56 -48
  29. data/lib/fetch_util/browser/site_stabilization/community_and_marketplace.rb +0 -117
  30. data/lib/fetch_util/browser/site_stabilization/gitea_family_stabilization.rb +0 -60
  31. /data/lib/fetch_util/browser/site_stabilization/{azure_devops_pr_commit_details_script.rb → forges/azure_devops/pull_requests/commit_details_script.rb} +0 -0
  32. /data/lib/fetch_util/browser/site_stabilization/{azure_devops_pr_product_state_script.rb → forges/azure_devops/pull_requests/product_state_script.rb} +0 -0
  33. /data/lib/fetch_util/browser/site_stabilization/{azure_devops_pr_request_helpers_script.rb → forges/azure_devops/pull_requests/request_helpers_script.rb} +0 -0
  34. /data/lib/fetch_util/browser/site_stabilization/{azure_devops_pr_request_state_script.rb → forges/azure_devops/pull_requests/request_state_script.rb} +0 -0
  35. /data/lib/fetch_util/browser/site_stabilization/{azure_devops_pr_stabilization.rb → forges/azure_devops/pull_requests/stabilization.rb} +0 -0
  36. /data/lib/fetch_util/browser/site_stabilization/{azure_devops_pr_state.rb → forges/azure_devops/pull_requests/state.rb} +0 -0
  37. /data/lib/fetch_util/browser/site_stabilization/{bitbucket_cloud_pull_diff_product_state.rb → forges/bitbucket/pulls/diff/product_state.rb} +0 -0
  38. /data/lib/fetch_util/browser/site_stabilization/{bitbucket_cloud_pull_diff_request_state.rb → forges/bitbucket/pulls/diff/request_state.rb} +0 -0
  39. /data/lib/fetch_util/browser/site_stabilization/{bitbucket_cloud_pull_diff_state.rb → forges/bitbucket/pulls/diff/state.rb} +0 -0
  40. /data/lib/fetch_util/browser/site_stabilization/{bitbucket_cloud_pull_resource_state.rb → forges/bitbucket/pulls/resource_state.rb} +0 -0
  41. /data/lib/fetch_util/browser/site_stabilization/{bitbucket_cloud_thread_state.rb → forges/bitbucket/threads/state.rb} +0 -0
  42. /data/lib/fetch_util/browser/site_stabilization/{gerrit_change_product_state_script.rb → forges/gerrit/changes/product_state_script.rb} +0 -0
  43. /data/lib/fetch_util/browser/site_stabilization/{gerrit_change_request_state_script.rb → forges/gerrit/changes/request_state_script.rb} +0 -0
  44. /data/lib/fetch_util/browser/site_stabilization/{gerrit_change_stabilization.rb → forges/gerrit/changes/stabilization.rb} +0 -0
  45. /data/lib/fetch_util/browser/site_stabilization/{gerrit_change_state.rb → forges/gerrit/changes/state.rb} +0 -0
  46. /data/lib/fetch_util/browser/site_stabilization/{gerrit_file_resource_fetch_state_script.rb → forges/gerrit/resources/fetch_state_script.rb} +0 -0
  47. /data/lib/fetch_util/browser/site_stabilization/{gerrit_file_resource_product_state_script.rb → forges/gerrit/resources/product_state_script.rb} +0 -0
  48. /data/lib/fetch_util/browser/site_stabilization/{gerrit_file_resource_request_state_script.rb → forges/gerrit/resources/request_state_script.rb} +0 -0
  49. /data/lib/fetch_util/browser/site_stabilization/{gerrit_file_resource_route_state_script.rb → forges/gerrit/resources/route_state_script.rb} +0 -0
  50. /data/lib/fetch_util/browser/site_stabilization/{gerrit_file_resource_stabilization.rb → forges/gerrit/resources/stabilization.rb} +0 -0
  51. /data/lib/fetch_util/browser/site_stabilization/{gerrit_file_resource_state.rb → forges/gerrit/resources/state.rb} +0 -0
  52. /data/lib/fetch_util/browser/site_stabilization/{gerrit_file_resource_validation_state_script.rb → forges/gerrit/resources/validation_state_script.rb} +0 -0
  53. /data/lib/fetch_util/browser/site_stabilization/{gitea_family_pull_resource_product_state.rb → forges/gitea/pulls/product_state.rb} +0 -0
  54. /data/lib/fetch_util/browser/site_stabilization/{gitea_family_pull_resources.rb → forges/gitea/pulls/resources.rb} +0 -0
  55. /data/lib/fetch_util/browser/site_stabilization/{gitea_family_pull_resource_state.rb → forges/gitea/pulls/state.rb} +0 -0
  56. /data/lib/fetch_util/browser/site_stabilization/{gitea_family_threads.rb → forges/gitea/threads/index.rb} +0 -0
  57. /data/lib/fetch_util/browser/site_stabilization/{gitea_family_thread_product_state.rb → forges/gitea/threads/product_state.rb} +0 -0
  58. /data/lib/fetch_util/browser/site_stabilization/{gitea_family_thread_timeline_state.rb → forges/gitea/threads/timeline_state.rb} +0 -0
  59. /data/lib/fetch_util/browser/site_stabilization/{gitea_family_visibility_script.rb → forges/gitea/visibility_script.rb} +0 -0
  60. /data/lib/fetch_util/browser/site_stabilization/{github_pull_resource_stabilization.rb → forges/github/pull_resource_stabilization.rb} +0 -0
  61. /data/lib/fetch_util/browser/site_stabilization/{github_pull_resources.rb → forges/github/pull_resources.rb} +0 -0
  62. /data/lib/fetch_util/browser/site_stabilization/{github_threads.rb → forges/github/threads.rb} +0 -0
  63. /data/lib/fetch_util/browser/site_stabilization/{gitlab_merge_request_resource_state.rb → forges/gitlab/merge_requests/resource_state.rb} +0 -0
  64. /data/lib/fetch_util/browser/site_stabilization/{gitlab_merge_request_resource_state_script.rb → forges/gitlab/merge_requests/resource_state_script.rb} +0 -0
  65. /data/lib/fetch_util/browser/site_stabilization/{gitlab_merge_request_resource_visibility_script.rb → forges/gitlab/merge_requests/resource_visibility_script.rb} +0 -0
  66. /data/lib/fetch_util/browser/site_stabilization/{gitlab_merge_request_resources.rb → forges/gitlab/merge_requests/resources.rb} +0 -0
  67. /data/lib/fetch_util/browser/site_stabilization/{gitlab_repo.rb → forges/gitlab/repository.rb} +0 -0
  68. /data/lib/fetch_util/browser/site_stabilization/{gitlab_stabilization.rb → forges/gitlab/stabilization.rb} +0 -0
  69. /data/lib/fetch_util/browser/site_stabilization/{gitlab_threads.rb → forges/gitlab/threads.rb} +0 -0
@@ -3,104 +3,17 @@
3
3
  module FetchUtil
4
4
  class Browser
5
5
  module SiteStabilization
6
- autoload :AzureDevopsPrProductStateScript,
7
- "fetch_util/browser/site_stabilization/azure_devops_pr_product_state_script"
8
- autoload :AzureDevopsPrCommitDetailsScript,
9
- "fetch_util/browser/site_stabilization/azure_devops_pr_commit_details_script"
10
- autoload :AzureDevopsPrRequestHelpersScript,
11
- "fetch_util/browser/site_stabilization/azure_devops_pr_request_helpers_script"
12
- autoload :AzureDevopsPrRequestStateScript,
13
- "fetch_util/browser/site_stabilization/azure_devops_pr_request_state_script"
14
- autoload :AzureDevopsPrState, "fetch_util/browser/site_stabilization/azure_devops_pr_state"
15
- autoload :AzureDevopsPrStabilization,
16
- "fetch_util/browser/site_stabilization/azure_devops_pr_stabilization"
17
- autoload :BitbucketCloudThreadState,
18
- "fetch_util/browser/site_stabilization/bitbucket_cloud_thread_state"
19
- autoload :BitbucketCloudThreads, "fetch_util/browser/site_stabilization/bitbucket_cloud_threads"
20
- autoload :BitbucketCloudPullResourceModules,
21
- "fetch_util/browser/site_stabilization/bitbucket_cloud_pull_resource_modules"
22
- autoload :CommunityAndMarketplace, "fetch_util/browser/site_stabilization/community_and_marketplace"
23
- autoload :FacebookStabilization, "fetch_util/browser/site_stabilization/facebook_stabilization"
24
- autoload :GerritChangeProductStateScript,
25
- "fetch_util/browser/site_stabilization/gerrit_change_product_state_script"
26
- autoload :GerritChangeRequestStateScript,
27
- "fetch_util/browser/site_stabilization/gerrit_change_request_state_script"
28
- autoload :GerritChangeState, "fetch_util/browser/site_stabilization/gerrit_change_state"
29
- autoload :GerritChangeStabilization,
30
- "fetch_util/browser/site_stabilization/gerrit_change_stabilization"
31
- autoload :GerritFileResourceProductStateScript,
32
- "fetch_util/browser/site_stabilization/gerrit_file_resource_product_state_script"
33
- autoload :GerritFileResourceRouteStateScript,
34
- "fetch_util/browser/site_stabilization/gerrit_file_resource_route_state_script"
35
- autoload :GerritFileResourceFetchStateScript,
36
- "fetch_util/browser/site_stabilization/gerrit_file_resource_fetch_state_script"
37
- autoload :GerritFileResourceValidationStateScript,
38
- "fetch_util/browser/site_stabilization/gerrit_file_resource_validation_state_script"
39
- autoload :GerritFileResourceRequestStateScript,
40
- "fetch_util/browser/site_stabilization/gerrit_file_resource_request_state_script"
41
- autoload :GerritFileResourceState,
42
- "fetch_util/browser/site_stabilization/gerrit_file_resource_state"
43
- autoload :GerritFileResourceStabilization,
44
- "fetch_util/browser/site_stabilization/gerrit_file_resource_stabilization"
45
- autoload :GithubPullResources, "fetch_util/browser/site_stabilization/github_pull_resources"
46
- autoload :GithubPullResourceStabilization,
47
- "fetch_util/browser/site_stabilization/github_pull_resource_stabilization"
48
- autoload :GithubThreads, "fetch_util/browser/site_stabilization/github_threads"
49
- autoload :GiteaFamilyThreadProductState,
50
- "fetch_util/browser/site_stabilization/gitea_family_thread_product_state"
51
- autoload :GiteaFamilyThreadTimelineState,
52
- "fetch_util/browser/site_stabilization/gitea_family_thread_timeline_state"
53
- autoload :GiteaFamilyStabilization,
54
- "fetch_util/browser/site_stabilization/gitea_family_stabilization"
55
- autoload :GiteaFamilyVisibilityScript,
56
- "fetch_util/browser/site_stabilization/gitea_family_visibility_script"
57
- autoload :GiteaFamilyThreads, "fetch_util/browser/site_stabilization/gitea_family_threads"
58
- autoload :GiteaFamilyPullResourceProductState,
59
- "fetch_util/browser/site_stabilization/gitea_family_pull_resource_product_state"
60
- autoload :GiteaFamilyPullResourceState,
61
- "fetch_util/browser/site_stabilization/gitea_family_pull_resource_state"
62
- autoload :GiteaFamilyPullResources, "fetch_util/browser/site_stabilization/gitea_family_pull_resources"
63
- autoload :GitlabRepo, "fetch_util/browser/site_stabilization/gitlab_repo"
64
- autoload :GitlabMergeRequestResourceVisibilityScript,
65
- "fetch_util/browser/site_stabilization/gitlab_merge_request_resource_visibility_script"
66
- autoload :GitlabMergeRequestResourceStateScript,
67
- "fetch_util/browser/site_stabilization/gitlab_merge_request_resource_state_script"
68
- autoload :GitlabMergeRequestResourceState,
69
- "fetch_util/browser/site_stabilization/gitlab_merge_request_resource_state"
70
- autoload :GitlabMergeRequestResources, "fetch_util/browser/site_stabilization/gitlab_merge_request_resources"
71
- autoload :GitlabStabilization, "fetch_util/browser/site_stabilization/gitlab_stabilization"
72
- autoload :GitlabThreads, "fetch_util/browser/site_stabilization/gitlab_threads"
73
- autoload :SocialPlatforms, "fetch_util/browser/site_stabilization/social_platforms"
74
- autoload :TravelAndLodging, "fetch_util/browser/site_stabilization/travel_and_lodging"
6
+ autoload :CommunityStabilization, "fetch_util/browser/site_stabilization/communities"
7
+ autoload :ForgeStabilization, "fetch_util/browser/site_stabilization/forges"
8
+ autoload :MarketplaceStabilization, "fetch_util/browser/site_stabilization/marketplaces"
9
+ autoload :SocialStabilization, "fetch_util/browser/site_stabilization/social"
10
+ autoload :TravelStabilization, "fetch_util/browser/site_stabilization/travel"
75
11
 
76
- include AzureDevopsPrState
77
- include AzureDevopsPrStabilization
78
- include BitbucketCloudThreadState
79
- include BitbucketCloudThreads
80
- include BitbucketCloudPullResourceModules
81
- include CommunityAndMarketplace
82
- include FacebookStabilization
83
- include GerritChangeState
84
- include GerritChangeStabilization
85
- include GerritFileResourceState
86
- include GerritFileResourceStabilization
87
- include GithubPullResources
88
- include GithubPullResourceStabilization
89
- include GithubThreads
90
- include GiteaFamilyVisibilityScript
91
- include GiteaFamilyThreadProductState
92
- include GiteaFamilyThreadTimelineState
93
- include GiteaFamilyStabilization
94
- include GiteaFamilyThreads
95
- include GiteaFamilyPullResourceProductState
96
- include GiteaFamilyPullResourceState
97
- include GiteaFamilyPullResources
98
- include GitlabRepo
99
- include GitlabStabilization
100
- include GitlabMergeRequestResources
101
- include GitlabThreads
102
- include SocialPlatforms
103
- include TravelAndLodging
12
+ include CommunityStabilization
13
+ include ForgeStabilization
14
+ include MarketplaceStabilization
15
+ include SocialStabilization
16
+ include TravelStabilization
104
17
  end
105
18
  end
106
19
  end
@@ -6,10 +6,10 @@ module FetchUtil
6
6
  module Stabilization
7
7
  module PageFlow
8
8
  PAGE_FLOW_STABILIZATION_PROFILES = [
9
- SiteStabilization::CommunityAndMarketplace::COMMUNITY_MARKETPLACE_STABILIZATION_PROFILES[:stabilize_reddit],
10
- SiteStabilization::SocialPlatforms::SOCIAL_PLATFORM_STABILIZATION_PROFILES[:stabilize_instagram],
11
- SiteStabilization::SocialPlatforms::SOCIAL_PLATFORM_STABILIZATION_PROFILES[:stabilize_facebook],
12
- SiteStabilization::CommunityAndMarketplace::COMMUNITY_MARKETPLACE_STABILIZATION_PROFILES[:stabilize_ebay_search],
9
+ SiteStabilization::RedditStabilization::REDDIT_STABILIZATION_PROFILE,
10
+ SiteStabilization::InstagramStabilization::INSTAGRAM_STABILIZATION_PROFILE,
11
+ SiteStabilization::FacebookStabilization::FACEBOOK_STABILIZATION_PROFILE,
12
+ SiteStabilization::EbayStabilization::EBAY_STABILIZATION_PROFILE,
13
13
  SiteStabilization::GithubThreads::GITHUB_THREAD_STABILIZATION_PROFILE,
14
14
  SiteStabilization::GithubPullResources::GITHUB_PULL_RESOURCE_STABILIZATION_PROFILE,
15
15
  SiteStabilization::GitlabThreads::GITLAB_THREAD_STABILIZATION_PROFILE,
@@ -21,7 +21,7 @@ module FetchUtil
21
21
  SiteStabilization::AzureDevopsPrStabilization::AZURE_DEVOPS_PR_STABILIZATION_PROFILE,
22
22
  SiteStabilization::GerritFileResourceStabilization::GERRIT_FILE_RESOURCE_STABILIZATION_PROFILE,
23
23
  SiteStabilization::GerritChangeStabilization::GERRIT_CHANGE_STABILIZATION_PROFILE,
24
- SiteStabilization::TravelAndLodging::TRAVEL_LODGING_STABILIZATION_PROFILES[:stabilize_lodging_detail],
24
+ SiteStabilization::LodgingStabilization::LODGING_STABILIZATION_PROFILE,
25
25
  { host: "t.me", path_query: ->(uri) { uri.path.match?(%r{\A/s/[^/]+/\d+/?\z}) },
26
26
  strategy: :wait_for_telegram_message, notes: "Wait for the requested public Telegram preview message.",
27
27
  tests: "spec/fetch_util/browser_stabilization_spec.rb" },
@@ -95,6 +95,8 @@ module FetchUtil
95
95
 
96
96
  def matching_stabilization_profile(url, profiles)
97
97
  uri = URI.parse(url)
98
+ return nil unless uri.is_a?(URI::HTTP) && uri.host
99
+
98
100
  host = FetchUtil.strip_www_host(url)
99
101
  profiles.find { |profile| profile_match?(profile, uri, host) }
100
102
  rescue URI::InvalidURIError
@@ -233,6 +233,9 @@ module FetchUtil
233
233
  raise unless page_loaded_enough?(page)
234
234
  end
235
235
  stabilize_page(page, loaded_page_url(page, url))
236
+ if page.current_url == "about:blank" && url != "about:blank"
237
+ raise Ferrum::Error, "Request to #{url} finished on about:blank without a public page"
238
+ end
236
239
  page
237
240
  rescue Ferrum::PendingConnectionsError, Ferrum::TimeoutError, Ferrum::Error => e
238
241
  close_page(page)
@@ -300,7 +300,7 @@ module FetchUtil
300
300
  def markdown_from_root(root, title)
301
301
  sections = []
302
302
  blocks = root.css(BLOCK_SELECTOR).to_a
303
- blocks.unshift(root) if %w[ul ol].include?(root.name)
303
+ blocks.unshift(root) if BLOCK_ELEMENTS.include?(root.name)
304
304
  blocks.each do |node|
305
305
  next if node.ancestors.any? { |ancestor| %w[ul ol].include?(ancestor.name) }
306
306
 
@@ -320,6 +320,10 @@ module FetchUtil
320
320
  sections << [fence, code, fence].join("\n")
321
321
  when "ul", "ol"
322
322
  sections << markdown_list(node)
323
+ when "li"
324
+ content = node.dup
325
+ content.css("ul, ol").remove
326
+ sections << "- #{clean_text(content.text)}"
323
327
  when "tr"
324
328
  cells = node.css("th, td").map { |cell| clean_text(cell.text) }.reject(&:empty?)
325
329
  sections << "- #{cells.join(": ")}" unless cells.empty?
@@ -3,12 +3,14 @@
3
3
  module FetchUtil
4
4
  class Regulatory
5
5
  module CacheStore
6
+ include CacheValidation
7
+
6
8
  private
7
9
 
8
- def cache_fetch(key)
10
+ def cache_fetch(key, shape: nil)
9
11
  path = cache_file_path(key)
10
12
  cached = read_cache(path)
11
- return cached if cached
13
+ return cached if cached && (!shape || cache_payload_matches?(cached, shape))
12
14
 
13
15
  payload, cacheable = yield
14
16
  begin
@@ -20,7 +22,7 @@ module FetchUtil
20
22
  end
21
23
 
22
24
  def fetch_record(key, uri, fallback: nil, require_success: true)
23
- cache_fetch(key) do
25
+ cache_fetch(key, shape: fallback) do
24
26
  response, cacheable = record_response(uri, require_success: require_success)
25
27
  payload = response ? yield(response.body, response) : fallback
26
28
  [payload, cacheable]
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FetchUtil
4
+ class Regulatory
5
+ module CacheValidation
6
+ private
7
+
8
+ def cache_payload_matches?(payload, shape)
9
+ case shape
10
+ when Hash
11
+ payload.is_a?(Hash) && shape.all? do |key, value_shape|
12
+ payload.key?(key) && cache_payload_matches?(payload[key], value_shape)
13
+ end
14
+ when Array
15
+ payload.is_a?(Array)
16
+ when nil
17
+ payload.nil? || payload.is_a?(String)
18
+ else
19
+ payload.is_a?(shape.class)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -20,7 +20,7 @@ module FetchUtil
20
20
  end
21
21
 
22
22
  def tdm_policy_record(url, target_origin:)
23
- cache_fetch("tdmpolicy:#{origin_key(target_origin)}:#{url}") do
23
+ cache_fetch("tdmpolicy:#{origin_key(target_origin)}:#{url}", shape: { "signals" => [] }) do
24
24
  response, cacheable = safe_get(url)
25
25
  signals = []
26
26
  if response&.status&.between?(200, 299) && json_like_response?(response.headers, response.body)
@@ -43,6 +43,7 @@ module FetchUtil
43
43
  autoload :SourceSelection, "fetch_util/regulatory/source_selection"
44
44
  autoload :Signals, "fetch_util/regulatory/signals"
45
45
  autoload :FetchRecords, "fetch_util/regulatory/fetch_records"
46
+ autoload :CacheValidation, "fetch_util/regulatory/cache_validation"
46
47
  autoload :CacheStore, "fetch_util/regulatory/cache_store"
47
48
  autoload :Robots, "fetch_util/regulatory/robots"
48
49
  autoload :RobotGlobs, "fetch_util/regulatory/robot_globs"
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module FetchUtil
4
- VERSION = "0.7.0"
4
+ VERSION = "0.8.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fetch_util
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - hmdne
@@ -102,53 +102,60 @@ files:
102
102
  - lib/fetch_util/browser/navigation/navigator_patch.rb
103
103
  - lib/fetch_util/browser/navigation/shadow_root_patch.rb
104
104
  - lib/fetch_util/browser/site_stabilization.rb
105
- - lib/fetch_util/browser/site_stabilization/azure_devops_pr_commit_details_script.rb
106
- - lib/fetch_util/browser/site_stabilization/azure_devops_pr_product_state_script.rb
107
- - lib/fetch_util/browser/site_stabilization/azure_devops_pr_request_helpers_script.rb
108
- - lib/fetch_util/browser/site_stabilization/azure_devops_pr_request_state_script.rb
109
- - lib/fetch_util/browser/site_stabilization/azure_devops_pr_stabilization.rb
110
- - lib/fetch_util/browser/site_stabilization/azure_devops_pr_state.rb
111
- - lib/fetch_util/browser/site_stabilization/bitbucket_cloud_pull_diff_product_state.rb
112
- - lib/fetch_util/browser/site_stabilization/bitbucket_cloud_pull_diff_request_state.rb
113
- - lib/fetch_util/browser/site_stabilization/bitbucket_cloud_pull_diff_state.rb
114
- - lib/fetch_util/browser/site_stabilization/bitbucket_cloud_pull_resource_modules.rb
115
- - lib/fetch_util/browser/site_stabilization/bitbucket_cloud_pull_resource_state.rb
116
- - lib/fetch_util/browser/site_stabilization/bitbucket_cloud_pull_resources.rb
117
- - lib/fetch_util/browser/site_stabilization/bitbucket_cloud_thread_state.rb
118
- - lib/fetch_util/browser/site_stabilization/bitbucket_cloud_threads.rb
119
- - lib/fetch_util/browser/site_stabilization/community_and_marketplace.rb
120
- - lib/fetch_util/browser/site_stabilization/facebook_stabilization.rb
121
- - lib/fetch_util/browser/site_stabilization/gerrit_change_product_state_script.rb
122
- - lib/fetch_util/browser/site_stabilization/gerrit_change_request_state_script.rb
123
- - lib/fetch_util/browser/site_stabilization/gerrit_change_stabilization.rb
124
- - lib/fetch_util/browser/site_stabilization/gerrit_change_state.rb
125
- - lib/fetch_util/browser/site_stabilization/gerrit_file_resource_fetch_state_script.rb
126
- - lib/fetch_util/browser/site_stabilization/gerrit_file_resource_product_state_script.rb
127
- - lib/fetch_util/browser/site_stabilization/gerrit_file_resource_request_state_script.rb
128
- - lib/fetch_util/browser/site_stabilization/gerrit_file_resource_route_state_script.rb
129
- - lib/fetch_util/browser/site_stabilization/gerrit_file_resource_stabilization.rb
130
- - lib/fetch_util/browser/site_stabilization/gerrit_file_resource_state.rb
131
- - lib/fetch_util/browser/site_stabilization/gerrit_file_resource_validation_state_script.rb
132
- - lib/fetch_util/browser/site_stabilization/gitea_family_pull_resource_product_state.rb
133
- - lib/fetch_util/browser/site_stabilization/gitea_family_pull_resource_state.rb
134
- - lib/fetch_util/browser/site_stabilization/gitea_family_pull_resources.rb
135
- - lib/fetch_util/browser/site_stabilization/gitea_family_stabilization.rb
136
- - lib/fetch_util/browser/site_stabilization/gitea_family_thread_product_state.rb
137
- - lib/fetch_util/browser/site_stabilization/gitea_family_thread_timeline_state.rb
138
- - lib/fetch_util/browser/site_stabilization/gitea_family_threads.rb
139
- - lib/fetch_util/browser/site_stabilization/gitea_family_visibility_script.rb
140
- - lib/fetch_util/browser/site_stabilization/github_pull_resource_stabilization.rb
141
- - lib/fetch_util/browser/site_stabilization/github_pull_resources.rb
142
- - lib/fetch_util/browser/site_stabilization/github_threads.rb
143
- - lib/fetch_util/browser/site_stabilization/gitlab_merge_request_resource_state.rb
144
- - lib/fetch_util/browser/site_stabilization/gitlab_merge_request_resource_state_script.rb
145
- - lib/fetch_util/browser/site_stabilization/gitlab_merge_request_resource_visibility_script.rb
146
- - lib/fetch_util/browser/site_stabilization/gitlab_merge_request_resources.rb
147
- - lib/fetch_util/browser/site_stabilization/gitlab_repo.rb
148
- - lib/fetch_util/browser/site_stabilization/gitlab_stabilization.rb
149
- - lib/fetch_util/browser/site_stabilization/gitlab_threads.rb
150
- - lib/fetch_util/browser/site_stabilization/social_platforms.rb
151
- - lib/fetch_util/browser/site_stabilization/travel_and_lodging.rb
105
+ - lib/fetch_util/browser/site_stabilization/communities.rb
106
+ - lib/fetch_util/browser/site_stabilization/communities/reddit.rb
107
+ - lib/fetch_util/browser/site_stabilization/forges.rb
108
+ - lib/fetch_util/browser/site_stabilization/forges/azure_devops/pull_requests/commit_details_script.rb
109
+ - lib/fetch_util/browser/site_stabilization/forges/azure_devops/pull_requests/product_state_script.rb
110
+ - lib/fetch_util/browser/site_stabilization/forges/azure_devops/pull_requests/request_helpers_script.rb
111
+ - lib/fetch_util/browser/site_stabilization/forges/azure_devops/pull_requests/request_state_script.rb
112
+ - lib/fetch_util/browser/site_stabilization/forges/azure_devops/pull_requests/stabilization.rb
113
+ - lib/fetch_util/browser/site_stabilization/forges/azure_devops/pull_requests/state.rb
114
+ - lib/fetch_util/browser/site_stabilization/forges/bitbucket/pulls/diff/product_state.rb
115
+ - lib/fetch_util/browser/site_stabilization/forges/bitbucket/pulls/diff/request_state.rb
116
+ - lib/fetch_util/browser/site_stabilization/forges/bitbucket/pulls/diff/state.rb
117
+ - lib/fetch_util/browser/site_stabilization/forges/bitbucket/pulls/resource_modules.rb
118
+ - lib/fetch_util/browser/site_stabilization/forges/bitbucket/pulls/resource_state.rb
119
+ - lib/fetch_util/browser/site_stabilization/forges/bitbucket/pulls/resources.rb
120
+ - lib/fetch_util/browser/site_stabilization/forges/bitbucket/threads/index.rb
121
+ - lib/fetch_util/browser/site_stabilization/forges/bitbucket/threads/state.rb
122
+ - lib/fetch_util/browser/site_stabilization/forges/gerrit/changes/product_state_script.rb
123
+ - lib/fetch_util/browser/site_stabilization/forges/gerrit/changes/request_state_script.rb
124
+ - lib/fetch_util/browser/site_stabilization/forges/gerrit/changes/stabilization.rb
125
+ - lib/fetch_util/browser/site_stabilization/forges/gerrit/changes/state.rb
126
+ - lib/fetch_util/browser/site_stabilization/forges/gerrit/resources/fetch_state_script.rb
127
+ - lib/fetch_util/browser/site_stabilization/forges/gerrit/resources/product_state_script.rb
128
+ - lib/fetch_util/browser/site_stabilization/forges/gerrit/resources/request_state_script.rb
129
+ - lib/fetch_util/browser/site_stabilization/forges/gerrit/resources/route_state_script.rb
130
+ - lib/fetch_util/browser/site_stabilization/forges/gerrit/resources/stabilization.rb
131
+ - lib/fetch_util/browser/site_stabilization/forges/gerrit/resources/state.rb
132
+ - lib/fetch_util/browser/site_stabilization/forges/gerrit/resources/validation_state_script.rb
133
+ - lib/fetch_util/browser/site_stabilization/forges/gitea/pulls/product_state.rb
134
+ - lib/fetch_util/browser/site_stabilization/forges/gitea/pulls/resources.rb
135
+ - lib/fetch_util/browser/site_stabilization/forges/gitea/pulls/state.rb
136
+ - lib/fetch_util/browser/site_stabilization/forges/gitea/stabilization.rb
137
+ - lib/fetch_util/browser/site_stabilization/forges/gitea/threads/index.rb
138
+ - lib/fetch_util/browser/site_stabilization/forges/gitea/threads/product_state.rb
139
+ - lib/fetch_util/browser/site_stabilization/forges/gitea/threads/timeline_state.rb
140
+ - lib/fetch_util/browser/site_stabilization/forges/gitea/visibility_script.rb
141
+ - lib/fetch_util/browser/site_stabilization/forges/github/pull_resource_stabilization.rb
142
+ - lib/fetch_util/browser/site_stabilization/forges/github/pull_resources.rb
143
+ - lib/fetch_util/browser/site_stabilization/forges/github/threads.rb
144
+ - lib/fetch_util/browser/site_stabilization/forges/gitlab/merge_requests/resource_state.rb
145
+ - lib/fetch_util/browser/site_stabilization/forges/gitlab/merge_requests/resource_state_script.rb
146
+ - lib/fetch_util/browser/site_stabilization/forges/gitlab/merge_requests/resource_visibility_script.rb
147
+ - lib/fetch_util/browser/site_stabilization/forges/gitlab/merge_requests/resources.rb
148
+ - lib/fetch_util/browser/site_stabilization/forges/gitlab/repository.rb
149
+ - lib/fetch_util/browser/site_stabilization/forges/gitlab/stabilization.rb
150
+ - lib/fetch_util/browser/site_stabilization/forges/gitlab/threads.rb
151
+ - lib/fetch_util/browser/site_stabilization/forges/observation_state.rb
152
+ - lib/fetch_util/browser/site_stabilization/marketplaces.rb
153
+ - lib/fetch_util/browser/site_stabilization/marketplaces/ebay.rb
154
+ - lib/fetch_util/browser/site_stabilization/social.rb
155
+ - lib/fetch_util/browser/site_stabilization/social/facebook.rb
156
+ - lib/fetch_util/browser/site_stabilization/social/instagram.rb
157
+ - lib/fetch_util/browser/site_stabilization/travel.rb
158
+ - lib/fetch_util/browser/site_stabilization/travel/lodging.rb
152
159
  - lib/fetch_util/browser/stabilization.rb
153
160
  - lib/fetch_util/browser/stabilization/anubis.rb
154
161
  - lib/fetch_util/browser/stabilization/page_flow.rb
@@ -161,6 +168,7 @@ files:
161
168
  - lib/fetch_util/raw_docs_fallback.rb
162
169
  - lib/fetch_util/regulatory.rb
163
170
  - lib/fetch_util/regulatory/cache_store.rb
171
+ - lib/fetch_util/regulatory/cache_validation.rb
164
172
  - lib/fetch_util/regulatory/directives.rb
165
173
  - lib/fetch_util/regulatory/fetch_records.rb
166
174
  - lib/fetch_util/regulatory/headers.rb
@@ -1,117 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module FetchUtil
4
- class Browser
5
- module SiteStabilization
6
- module CommunityAndMarketplace
7
- COMMUNITY_MARKETPLACE_STABILIZATION_PROFILES = {
8
- stabilize_reddit: {
9
- host: "reddit.com",
10
- strategy: :stabilize_reddit,
11
- notes: "Use fast Reddit cookie dismissal/content readiness instead of full idle waits.",
12
- tests: "spec/fetch_util/browser_stabilization_spec.rb"
13
- },
14
- stabilize_ebay_search: {
15
- host: "ebay.com",
16
- path_query: ->(uri) { uri.path.include?("/sch/") || uri.query.to_s.include?("_nkw=") },
17
- strategy: :stabilize_ebay_search,
18
- notes: "Wait for search result items or short-lived eBay browser checks.",
19
- tests: "spec/fetch_util/browser_stabilization_spec.rb"
20
- }
21
- }.freeze
22
-
23
- private
24
-
25
- def stabilize_reddit(page, deadline: stabilization_deadline)
26
- ready = retry_until_timeout(capped_timeout(3.0, deadline: deadline), interval: 0.1, deadline: deadline) do
27
- dismiss_reddit_cookie_dialog(page)
28
- reddit_content_ready?(page)
29
- end
30
-
31
- settle_after_stabilization(0.25, deadline: deadline)
32
- dismiss_reddit_cookie_dialog(page) if stabilization_time_remaining?(deadline)
33
- ready
34
- end
35
-
36
- def stabilize_ebay_search(page, deadline: stabilization_deadline)
37
- accepted_cookies = false
38
- cookie_config = consent_config(
39
- accept_labels: [
40
- "accept all",
41
- "accept all cookies",
42
- "accept cookies",
43
- "allow all",
44
- "allow cookies",
45
- "agree to cookies",
46
- "continue with cookies"
47
- ]
48
- )
49
-
50
- retry_until_timeout(capped_timeout(6.0, deadline: deadline), interval: 0.15, deadline: deadline) do
51
- accepted_cookies ||= click_visible_button_by_text(
52
- page,
53
- consent_accept_labels(cookie_config),
54
- selectors: consent_button_selectors(cookie_config)
55
- )
56
-
57
- state = safe_evaluate(page, <<~JS, default: { "itemCount" => 0, "challengeVisible" => false })
58
- (() => {
59
- const bodyText = document.body ? document.body.innerText : '';
60
- return {
61
- itemCount: document.querySelectorAll('li.s-item a[href*="/itm/"], ul.srp-results a[href*="/itm/"]').length,
62
- challengeVisible: /checking your browser before you access ebay|your browser will redirect to your requested content shortly|pardon our interruption/i.test(bodyText)
63
- };
64
- })()
65
- JS
66
-
67
- state["itemCount"].to_i >= 4 || (state["challengeVisible"] ? 0.35 : false)
68
- end
69
-
70
- settle_after_stabilization(0.25, deadline: deadline) if accepted_cookies
71
- end
72
-
73
- def reddit_content_ready?(page)
74
- safe_evaluate(page, <<~JS, default: false)
75
- !!document.querySelector('shreddit-post, faceplate-screen-reader-content, shreddit-comment, [data-testid="comment"]')
76
- JS
77
- end
78
-
79
- def dismiss_reddit_cookie_dialog(page)
80
- removed = dismiss_overlay_dialog(
81
- page,
82
- close_selectors: [],
83
- dialog_selectors: [
84
- '[data-testid="onboarding-modal"]',
85
- '[data-testid="gdpr-modal"]',
86
- '[aria-modal="true"]',
87
- '[role="dialog"]',
88
- "shreddit-experience-tree"
89
- ],
90
- dialog_pattern: "before you continue to reddit|let us know your cookie preferences"
91
- )
92
- return true if removed
93
-
94
- safe_evaluate(page, <<~JS)
95
- (() => {
96
- #{js_dom_helpers}
97
- let removed = false;
98
- document.querySelectorAll('section, div, aside, form, footer, shreddit-experience-tree').forEach((node) => {
99
- const text = (node.innerText || node.textContent || '').replace(/\s+/g, ' ').trim();
100
- if (/before you continue to reddit|let us know your cookie preferences/i.test(text) && text.length < 2000) {
101
- node.remove();
102
- removed = true;
103
- }
104
- });
105
-
106
- if (removed) {
107
- restoreScroll();
108
- }
109
-
110
- return removed;
111
- })()
112
- JS
113
- end
114
- end
115
- end
116
- end
117
- end
@@ -1,60 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module FetchUtil
4
- class Browser
5
- module SiteStabilization
6
- module GiteaFamilyStabilization
7
- private
8
-
9
- def stabilize_gitea_family_state(page, state_script, deadline: stabilization_deadline)
10
- last_signature = nil
11
- stable_observations = 0
12
- incomplete_signature = nil
13
- incomplete_observations = 0
14
- terminal_incomplete = false
15
- observed = retry_until_timeout(
16
- capped_timeout(6.0, deadline: deadline),
17
- interval: 0.1,
18
- deadline: deadline
19
- ) do
20
- state = safe_evaluate(page, state_script, default: nil)
21
- return false if state.is_a?(Hash) && state["product"] == false
22
- next false unless state.is_a?(Hash) && state["product"]
23
-
24
- unless state["ready"]
25
- if state["loading"]
26
- incomplete_signature = nil
27
- incomplete_observations = 0
28
- elsif state["signature"] == incomplete_signature
29
- incomplete_observations += 1
30
- else
31
- incomplete_signature = state["signature"]
32
- incomplete_observations = 1
33
- end
34
- if incomplete_observations >= 10
35
- terminal_incomplete = true
36
- next true
37
- end
38
- next false
39
- end
40
-
41
- incomplete_signature = nil
42
- incomplete_observations = 0
43
- if state["signature"] == last_signature
44
- stable_observations += 1
45
- else
46
- last_signature = state["signature"]
47
- stable_observations = 1
48
- end
49
- stable_observations >= 3
50
- end
51
-
52
- return false if terminal_incomplete
53
-
54
- settle_after_stabilization(0.5, deadline: deadline) if observed
55
- !!observed
56
- end
57
- end
58
- end
59
- end
60
- end