fetch_util 0.6.2 → 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 +187 -0
- data/README.md +2 -1
- data/lib/fetch_util/assets/extract.js +1 -1
- data/lib/fetch_util/browser/navigation/navigator_patch.rb +2 -0
- data/lib/fetch_util/browser/navigation/shadow_root_patch.rb +85 -0
- data/lib/fetch_util/browser/navigation.rb +2 -0
- 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 +6 -0
- data/lib/fetch_util/extractor.rb +115 -9
- 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 +57 -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
|
@@ -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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/data/lib/fetch_util/browser/site_stabilization/{github_threads.rb → forges/github/threads.rb}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/data/lib/fetch_util/browser/site_stabilization/{gitlab_repo.rb → forges/gitlab/repository.rb}
RENAMED
|
File without changes
|
|
File without changes
|
/data/lib/fetch_util/browser/site_stabilization/{gitlab_threads.rb → forges/gitlab/threads.rb}
RENAMED
|
File without changes
|