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.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +187 -0
  3. data/README.md +2 -1
  4. data/lib/fetch_util/assets/extract.js +1 -1
  5. data/lib/fetch_util/browser/navigation/navigator_patch.rb +2 -0
  6. data/lib/fetch_util/browser/navigation/shadow_root_patch.rb +85 -0
  7. data/lib/fetch_util/browser/navigation.rb +2 -0
  8. data/lib/fetch_util/browser/site_stabilization/communities/reddit.rb +71 -0
  9. data/lib/fetch_util/browser/site_stabilization/communities.rb +13 -0
  10. data/lib/fetch_util/browser/site_stabilization/{bitbucket_cloud_pull_resource_modules.rb → forges/bitbucket/pulls/resource_modules.rb} +5 -5
  11. data/lib/fetch_util/browser/site_stabilization/{bitbucket_cloud_pull_resources.rb → forges/bitbucket/pulls/resources.rb} +3 -34
  12. data/lib/fetch_util/browser/site_stabilization/{bitbucket_cloud_threads.rb → forges/bitbucket/threads/index.rb} +3 -34
  13. data/lib/fetch_util/browser/site_stabilization/forges/gitea/stabilization.rb +31 -0
  14. data/lib/fetch_util/browser/site_stabilization/forges/observation_state.rb +59 -0
  15. data/lib/fetch_util/browser/site_stabilization/forges.rb +109 -0
  16. data/lib/fetch_util/browser/site_stabilization/marketplaces/ebay.rb +56 -0
  17. data/lib/fetch_util/browser/site_stabilization/marketplaces.rb +13 -0
  18. data/lib/fetch_util/browser/site_stabilization/{facebook_stabilization.rb → social/facebook.rb} +7 -0
  19. data/lib/fetch_util/browser/site_stabilization/{social_platforms.rb → social/instagram.rb} +6 -8
  20. data/lib/fetch_util/browser/site_stabilization/social.rb +15 -0
  21. data/lib/fetch_util/browser/site_stabilization/{travel_and_lodging.rb → travel/lodging.rb} +7 -9
  22. data/lib/fetch_util/browser/site_stabilization/travel.rb +13 -0
  23. data/lib/fetch_util/browser/site_stabilization.rb +10 -97
  24. data/lib/fetch_util/browser/stabilization/page_flow.rb +7 -5
  25. data/lib/fetch_util/browser.rb +6 -0
  26. data/lib/fetch_util/extractor.rb +115 -9
  27. data/lib/fetch_util/raw_docs_fallback.rb +5 -1
  28. data/lib/fetch_util/regulatory/cache_store.rb +5 -3
  29. data/lib/fetch_util/regulatory/cache_validation.rb +24 -0
  30. data/lib/fetch_util/regulatory/tdm_policy.rb +1 -1
  31. data/lib/fetch_util/regulatory.rb +1 -0
  32. data/lib/fetch_util/version.rb +1 -1
  33. metadata +57 -48
  34. data/lib/fetch_util/browser/site_stabilization/community_and_marketplace.rb +0 -117
  35. data/lib/fetch_util/browser/site_stabilization/gitea_family_stabilization.rb +0 -60
  36. /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
  37. /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
  38. /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
  39. /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
  40. /data/lib/fetch_util/browser/site_stabilization/{azure_devops_pr_stabilization.rb → forges/azure_devops/pull_requests/stabilization.rb} +0 -0
  41. /data/lib/fetch_util/browser/site_stabilization/{azure_devops_pr_state.rb → forges/azure_devops/pull_requests/state.rb} +0 -0
  42. /data/lib/fetch_util/browser/site_stabilization/{bitbucket_cloud_pull_diff_product_state.rb → forges/bitbucket/pulls/diff/product_state.rb} +0 -0
  43. /data/lib/fetch_util/browser/site_stabilization/{bitbucket_cloud_pull_diff_request_state.rb → forges/bitbucket/pulls/diff/request_state.rb} +0 -0
  44. /data/lib/fetch_util/browser/site_stabilization/{bitbucket_cloud_pull_diff_state.rb → forges/bitbucket/pulls/diff/state.rb} +0 -0
  45. /data/lib/fetch_util/browser/site_stabilization/{bitbucket_cloud_pull_resource_state.rb → forges/bitbucket/pulls/resource_state.rb} +0 -0
  46. /data/lib/fetch_util/browser/site_stabilization/{bitbucket_cloud_thread_state.rb → forges/bitbucket/threads/state.rb} +0 -0
  47. /data/lib/fetch_util/browser/site_stabilization/{gerrit_change_product_state_script.rb → forges/gerrit/changes/product_state_script.rb} +0 -0
  48. /data/lib/fetch_util/browser/site_stabilization/{gerrit_change_request_state_script.rb → forges/gerrit/changes/request_state_script.rb} +0 -0
  49. /data/lib/fetch_util/browser/site_stabilization/{gerrit_change_stabilization.rb → forges/gerrit/changes/stabilization.rb} +0 -0
  50. /data/lib/fetch_util/browser/site_stabilization/{gerrit_change_state.rb → forges/gerrit/changes/state.rb} +0 -0
  51. /data/lib/fetch_util/browser/site_stabilization/{gerrit_file_resource_fetch_state_script.rb → forges/gerrit/resources/fetch_state_script.rb} +0 -0
  52. /data/lib/fetch_util/browser/site_stabilization/{gerrit_file_resource_product_state_script.rb → forges/gerrit/resources/product_state_script.rb} +0 -0
  53. /data/lib/fetch_util/browser/site_stabilization/{gerrit_file_resource_request_state_script.rb → forges/gerrit/resources/request_state_script.rb} +0 -0
  54. /data/lib/fetch_util/browser/site_stabilization/{gerrit_file_resource_route_state_script.rb → forges/gerrit/resources/route_state_script.rb} +0 -0
  55. /data/lib/fetch_util/browser/site_stabilization/{gerrit_file_resource_stabilization.rb → forges/gerrit/resources/stabilization.rb} +0 -0
  56. /data/lib/fetch_util/browser/site_stabilization/{gerrit_file_resource_state.rb → forges/gerrit/resources/state.rb} +0 -0
  57. /data/lib/fetch_util/browser/site_stabilization/{gerrit_file_resource_validation_state_script.rb → forges/gerrit/resources/validation_state_script.rb} +0 -0
  58. /data/lib/fetch_util/browser/site_stabilization/{gitea_family_pull_resource_product_state.rb → forges/gitea/pulls/product_state.rb} +0 -0
  59. /data/lib/fetch_util/browser/site_stabilization/{gitea_family_pull_resources.rb → forges/gitea/pulls/resources.rb} +0 -0
  60. /data/lib/fetch_util/browser/site_stabilization/{gitea_family_pull_resource_state.rb → forges/gitea/pulls/state.rb} +0 -0
  61. /data/lib/fetch_util/browser/site_stabilization/{gitea_family_threads.rb → forges/gitea/threads/index.rb} +0 -0
  62. /data/lib/fetch_util/browser/site_stabilization/{gitea_family_thread_product_state.rb → forges/gitea/threads/product_state.rb} +0 -0
  63. /data/lib/fetch_util/browser/site_stabilization/{gitea_family_thread_timeline_state.rb → forges/gitea/threads/timeline_state.rb} +0 -0
  64. /data/lib/fetch_util/browser/site_stabilization/{gitea_family_visibility_script.rb → forges/gitea/visibility_script.rb} +0 -0
  65. /data/lib/fetch_util/browser/site_stabilization/{github_pull_resource_stabilization.rb → forges/github/pull_resource_stabilization.rb} +0 -0
  66. /data/lib/fetch_util/browser/site_stabilization/{github_pull_resources.rb → forges/github/pull_resources.rb} +0 -0
  67. /data/lib/fetch_util/browser/site_stabilization/{github_threads.rb → forges/github/threads.rb} +0 -0
  68. /data/lib/fetch_util/browser/site_stabilization/{gitlab_merge_request_resource_state.rb → forges/gitlab/merge_requests/resource_state.rb} +0 -0
  69. /data/lib/fetch_util/browser/site_stabilization/{gitlab_merge_request_resource_state_script.rb → forges/gitlab/merge_requests/resource_state_script.rb} +0 -0
  70. /data/lib/fetch_util/browser/site_stabilization/{gitlab_merge_request_resource_visibility_script.rb → forges/gitlab/merge_requests/resource_visibility_script.rb} +0 -0
  71. /data/lib/fetch_util/browser/site_stabilization/{gitlab_merge_request_resources.rb → forges/gitlab/merge_requests/resources.rb} +0 -0
  72. /data/lib/fetch_util/browser/site_stabilization/{gitlab_repo.rb → forges/gitlab/repository.rb} +0 -0
  73. /data/lib/fetch_util/browser/site_stabilization/{gitlab_stabilization.rb → forges/gitlab/stabilization.rb} +0 -0
  74. /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