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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +27 -0
- data/lib/fetch_util/assets/extract.js +1 -1
- data/lib/fetch_util/browser/site_stabilization/communities/reddit.rb +71 -0
- data/lib/fetch_util/browser/site_stabilization/communities.rb +13 -0
- data/lib/fetch_util/browser/site_stabilization/{bitbucket_cloud_pull_resource_modules.rb → forges/bitbucket/pulls/resource_modules.rb} +5 -5
- data/lib/fetch_util/browser/site_stabilization/{bitbucket_cloud_pull_resources.rb → forges/bitbucket/pulls/resources.rb} +3 -34
- data/lib/fetch_util/browser/site_stabilization/{bitbucket_cloud_threads.rb → forges/bitbucket/threads/index.rb} +3 -34
- data/lib/fetch_util/browser/site_stabilization/forges/gitea/stabilization.rb +31 -0
- data/lib/fetch_util/browser/site_stabilization/forges/observation_state.rb +59 -0
- data/lib/fetch_util/browser/site_stabilization/forges.rb +109 -0
- data/lib/fetch_util/browser/site_stabilization/marketplaces/ebay.rb +56 -0
- data/lib/fetch_util/browser/site_stabilization/marketplaces.rb +13 -0
- data/lib/fetch_util/browser/site_stabilization/{facebook_stabilization.rb → social/facebook.rb} +7 -0
- data/lib/fetch_util/browser/site_stabilization/{social_platforms.rb → social/instagram.rb} +6 -8
- data/lib/fetch_util/browser/site_stabilization/social.rb +15 -0
- data/lib/fetch_util/browser/site_stabilization/{travel_and_lodging.rb → travel/lodging.rb} +7 -9
- data/lib/fetch_util/browser/site_stabilization/travel.rb +13 -0
- data/lib/fetch_util/browser/site_stabilization.rb +10 -97
- data/lib/fetch_util/browser/stabilization/page_flow.rb +7 -5
- data/lib/fetch_util/browser.rb +3 -0
- data/lib/fetch_util/raw_docs_fallback.rb +5 -1
- data/lib/fetch_util/regulatory/cache_store.rb +5 -3
- data/lib/fetch_util/regulatory/cache_validation.rb +24 -0
- data/lib/fetch_util/regulatory/tdm_policy.rb +1 -1
- data/lib/fetch_util/regulatory.rb +1 -0
- data/lib/fetch_util/version.rb +1 -1
- metadata +56 -48
- data/lib/fetch_util/browser/site_stabilization/community_and_marketplace.rb +0 -117
- data/lib/fetch_util/browser/site_stabilization/gitea_family_stabilization.rb +0 -60
- /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
- /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
- /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
- /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
- /data/lib/fetch_util/browser/site_stabilization/{azure_devops_pr_stabilization.rb → forges/azure_devops/pull_requests/stabilization.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{azure_devops_pr_state.rb → forges/azure_devops/pull_requests/state.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{bitbucket_cloud_pull_diff_product_state.rb → forges/bitbucket/pulls/diff/product_state.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{bitbucket_cloud_pull_diff_request_state.rb → forges/bitbucket/pulls/diff/request_state.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{bitbucket_cloud_pull_diff_state.rb → forges/bitbucket/pulls/diff/state.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{bitbucket_cloud_pull_resource_state.rb → forges/bitbucket/pulls/resource_state.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{bitbucket_cloud_thread_state.rb → forges/bitbucket/threads/state.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{gerrit_change_product_state_script.rb → forges/gerrit/changes/product_state_script.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{gerrit_change_request_state_script.rb → forges/gerrit/changes/request_state_script.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{gerrit_change_stabilization.rb → forges/gerrit/changes/stabilization.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{gerrit_change_state.rb → forges/gerrit/changes/state.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{gerrit_file_resource_fetch_state_script.rb → forges/gerrit/resources/fetch_state_script.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{gerrit_file_resource_product_state_script.rb → forges/gerrit/resources/product_state_script.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{gerrit_file_resource_request_state_script.rb → forges/gerrit/resources/request_state_script.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{gerrit_file_resource_route_state_script.rb → forges/gerrit/resources/route_state_script.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{gerrit_file_resource_stabilization.rb → forges/gerrit/resources/stabilization.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{gerrit_file_resource_state.rb → forges/gerrit/resources/state.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{gerrit_file_resource_validation_state_script.rb → forges/gerrit/resources/validation_state_script.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{gitea_family_pull_resource_product_state.rb → forges/gitea/pulls/product_state.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{gitea_family_pull_resources.rb → forges/gitea/pulls/resources.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{gitea_family_pull_resource_state.rb → forges/gitea/pulls/state.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{gitea_family_threads.rb → forges/gitea/threads/index.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{gitea_family_thread_product_state.rb → forges/gitea/threads/product_state.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{gitea_family_thread_timeline_state.rb → forges/gitea/threads/timeline_state.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{gitea_family_visibility_script.rb → forges/gitea/visibility_script.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{github_pull_resource_stabilization.rb → forges/github/pull_resource_stabilization.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{github_pull_resources.rb → forges/github/pull_resources.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{github_threads.rb → forges/github/threads.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{gitlab_merge_request_resource_state.rb → forges/gitlab/merge_requests/resource_state.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{gitlab_merge_request_resource_state_script.rb → forges/gitlab/merge_requests/resource_state_script.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{gitlab_merge_request_resource_visibility_script.rb → forges/gitlab/merge_requests/resource_visibility_script.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{gitlab_merge_request_resources.rb → forges/gitlab/merge_requests/resources.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{gitlab_repo.rb → forges/gitlab/repository.rb} +0 -0
- /data/lib/fetch_util/browser/site_stabilization/{gitlab_stabilization.rb → forges/gitlab/stabilization.rb} +0 -0
- /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 :
|
|
7
|
-
|
|
8
|
-
autoload :
|
|
9
|
-
|
|
10
|
-
autoload :
|
|
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
|
|
77
|
-
include
|
|
78
|
-
include
|
|
79
|
-
include
|
|
80
|
-
include
|
|
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::
|
|
10
|
-
SiteStabilization::
|
|
11
|
-
SiteStabilization::
|
|
12
|
-
SiteStabilization::
|
|
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::
|
|
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
|
data/lib/fetch_util/browser.rb
CHANGED
|
@@ -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
|
|
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"
|
data/lib/fetch_util/version.rb
CHANGED
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.
|
|
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/
|
|
106
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
107
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
108
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
109
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
110
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
111
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
112
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
113
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
114
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
115
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
116
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
117
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
118
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
119
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
120
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
121
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
122
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
123
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
124
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
125
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
126
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
127
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
128
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
129
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
130
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
131
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
132
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
133
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
134
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
135
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
136
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
137
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
138
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
139
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
140
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
141
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
142
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
143
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
144
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
145
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
146
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
147
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
148
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
149
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
150
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
151
|
-
- lib/fetch_util/browser/site_stabilization/
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|