Module: Async::WebDriver::Installer::Chrome::Releases
- Defined in:
- lib/async/webdriver/installer/chrome/releases.rb
Overview
Resolves Chrome for Testing version specifiers and download URLs using the public Chrome for Testing JSON API.
Constant Summary collapse
- CHANNELS_URL =
Returns the latest known-good version for each release channel.
"https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json"- VERSIONS_URL =
Returns every known-good version with its download URLs.
"https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json"- CHANNELS =
Maps symbolic channel names to the API’s title-case keys.
{ stable: "Stable", beta: "Beta", dev: "Dev", canary: "Canary", }.freeze
Class Method Summary collapse
- .extract(entry, platform) ⇒ Object
- .fetch_json(url) ⇒ Object
-
.resolve(version, platform) ⇒ Object
Resolve a version specifier and platform to a version string and download URLs.
- .resolve_channel(channel, platform) ⇒ Object
- .resolve_exact(version, platform) ⇒ Object
- .resolve_major(major, platform) ⇒ Object
Class Method Details
.extract(entry, platform) ⇒ Object
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
# File 'lib/async/webdriver/installer/chrome/releases.rb', line 92 def self.extract(entry, platform) version = entry["version"] downloads = entry["downloads"] chrome_url = downloads["chrome"] &.find{|d| d["platform"] == platform} &.dig("url") chromedriver_url = downloads["chromedriver"] &.find{|d| d["platform"] == platform} &.dig("url") raise "No Chrome download for platform #{platform} in version #{version}" unless chrome_url raise "No ChromeDriver download for platform #{platform} in version #{version}" unless chromedriver_url {version: version, chrome_url: chrome_url, chromedriver_url: chromedriver_url} end |
.fetch_json(url) ⇒ Object
46 47 48 49 50 51 52 53 54 55 56 57 58 |
# File 'lib/async/webdriver/installer/chrome/releases.rb', line 46 def self.fetch_json(url) require "async/http/internet" Sync do internet = Async::HTTP::Internet.new begin response = internet.get(url) JSON.parse(response.read) ensure internet.close end end end |
.resolve(version, platform) ⇒ Object
Resolve a version specifier and platform to a version string and download URLs.
35 36 37 38 39 40 41 42 |
# File 'lib/async/webdriver/installer/chrome/releases.rb', line 35 def self.resolve(version, platform) case version when Symbol then resolve_channel(version, platform) when /\A(stable|beta|dev|canary)\z/ then resolve_channel(version.to_sym, platform) when /\A\d+\z/ then resolve_major(version, platform) else resolve_exact(version, platform) end end |
.resolve_channel(channel, platform) ⇒ Object
60 61 62 63 64 65 66 67 68 69 |
# File 'lib/async/webdriver/installer/chrome/releases.rb', line 60 def self.resolve_channel(channel, platform) key = CHANNELS.fetch(channel) do raise ArgumentError, "Unknown channel #{channel.inspect}. Expected one of: #{CHANNELS.keys.inspect}" end data = fetch_json(CHANNELS_URL) entry = data.dig("channels", key) or raise "Channel #{key} not found in API response" extract(entry, platform) end |
.resolve_exact(version, platform) ⇒ Object
83 84 85 86 87 88 89 90 |
# File 'lib/async/webdriver/installer/chrome/releases.rb', line 83 def self.resolve_exact(version, platform) data = fetch_json(VERSIONS_URL) entry = data["versions"].find{|v| v["version"] == version} raise "Version #{version} not found" unless entry extract(entry, platform) end |
.resolve_major(major, platform) ⇒ Object
71 72 73 74 75 76 77 78 79 80 81 |
# File 'lib/async/webdriver/installer/chrome/releases.rb', line 71 def self.resolve_major(major, platform) data = fetch_json(VERSIONS_URL) entry = data["versions"] .select{|v| v["version"].start_with?("#{major}.")} .max_by{|v| Gem::Version.new(v["version"])} raise "No version found for major version #{major}" unless entry extract(entry, platform) end |