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

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