diff --git a/lib/datasource/rubygems/get.ts b/lib/datasource/rubygems/get.ts index 5e44a7cb838af0..ee913a02050407 100644 --- a/lib/datasource/rubygems/get.ts +++ b/lib/datasource/rubygems/get.ts @@ -50,23 +50,46 @@ export async function getDependency( return null; } - const versions = (await fetch(dependency, registry, VERSIONS_PATH)) || []; + let versions = []; + let releases = []; + try { + versions = await fetch(dependency, registry, VERSIONS_PATH); + } catch (err) { + if (err.statusCode === 400 || err.statusCode === 404) { + logger.debug( + { registry }, + 'versions endpoint returns error - falling back to info endpoint' + ); + } else { + throw err; + } + } - const releases = versions.map( - ({ - number: version, - platform: rubyPlatform, - created_at: releaseTimestamp, - rubygems_version: rubygemsVersion, - ruby_version: rubyVersion, - }) => ({ - version, - rubyPlatform, - releaseTimestamp, - rubygemsVersion, - rubyVersion, - }) - ); + if (versions.length === 0 && info.version) { + logger.warn('falling back to the version from the info endpoint'); + releases = [ + { + version: info.version, + rubyPlatform: info.platform, + }, + ]; + } else { + releases = versions.map( + ({ + number: version, + platform: rubyPlatform, + created_at: releaseTimestamp, + rubygems_version: rubygemsVersion, + ruby_version: rubyVersion, + }) => ({ + version, + rubyPlatform, + releaseTimestamp, + rubygemsVersion, + rubyVersion, + }) + ); + } return { releases, diff --git a/lib/datasource/rubygems/index.spec.ts b/lib/datasource/rubygems/index.spec.ts index b5f631b2c6071c..58321658af6871 100644 --- a/lib/datasource/rubygems/index.spec.ts +++ b/lib/datasource/rubygems/index.spec.ts @@ -167,5 +167,25 @@ describe('datasource/rubygems', () => { expect(await getPkgReleases(params)).toBeNull(); expect(httpMock.getTrace()).toMatchSnapshot(); }); + it('falls back to info when version request fails', async () => { + httpMock + .scope('https://thirdparty.com/') + .get('/api/v1/gems/rails.json') + .reply(200, railsInfo) + .get('/api/v1/versions/rails.json') + .reply(400, {}); + const res = await getPkgReleases(params); + expect(res.releases).toHaveLength(1); + expect(res.releases[0].version).toBe(railsInfo.version); + }); + it('errors when version request fails with anything other than 400 or 404', async () => { + httpMock + .scope('https://thirdparty.com/') + .get('/api/v1/gems/rails.json') + .reply(200, railsInfo) + .get('/api/v1/versions/rails.json') + .reply(500, {}); + expect(await getPkgReleases(params)).toBeNull(); + }); }); }); diff --git a/package.json b/package.json index 55260f04d3aa12..c30b5efde62b8d 100644 --- a/package.json +++ b/package.json @@ -96,7 +96,8 @@ "Viral Ruparel ", "Vladimir Starkov ", "Mikhail Yakushin ", - "Sebastian Poxhofer " + "Sebastian Poxhofer ", + "Henry Sachs " ], "license": "AGPL-3.0", "bugs": {