Skip to content
Snippets Groups Projects
Select Git revision
  • 24a237c15bf3ce77b7cc55b44f80d5ebf3fdb0c4
  • main default protected
  • renovate/main-redis-5.x
  • next
  • revert-31645-feat/rename-gradle-wrapper-validation-action
  • fix/36615b-branch-reuse-no-cache
  • chore/punycode
  • fix/36615-branch-reuse-bug
  • refactor/pin-new-value
  • feat/36219--git-x509-signing
  • feat/structured-logger
  • hotfix/39.264.1
  • feat/skip-dangling
  • gh-readonly-queue/next/pr-36034-7a061c4ca1024a19e2c295d773d9642625d1c2be
  • hotfix/39.238.3
  • refactor/gitlab-auto-approve
  • feat/template-strings
  • gh-readonly-queue/next/pr-35654-137d934242c784e0c45d4b957362214f0eade1d7
  • fix/32307-global-extends-merging
  • fix/32307-global-extends-repositories
  • gh-readonly-queue/next/pr-35009-046ebf7cb84ab859f7fefceb5fa53a54ce9736f8
  • 41.35.2
  • 41.35.1
  • 41.35.0
  • 41.34.1
  • 41.34.0
  • 41.33.0
  • 41.32.3
  • 41.32.2
  • 41.32.1
  • 41.32.0
  • 41.31.1
  • 41.31.0
  • 41.30.5
  • 41.30.4
  • 41.30.3
  • 41.30.2
  • 41.30.1
  • 41.30.0
  • 41.29.1
  • 41.29.0
41 results

url.ts

Blame
  • index.ts 2.63 KiB
    import { logger } from '../../../logger';
    import { ExternalHostError } from '../../../types/errors/external-host-error';
    import { cache } from '../../../util/cache/package/decorator';
    import { parse } from '../../../util/html';
    import type { HttpError } from '../../../util/http';
    import { isVersion, id as rubyVersioningId } from '../../versioning/ruby';
    import { Datasource } from '../datasource';
    import type { GetReleasesConfig, ReleaseResult } from '../types';
    
    export class RubyVersionDatasource extends Datasource {
      static readonly id = 'ruby-version';
    
      constructor() {
        super(RubyVersionDatasource.id);
      }
    
      override readonly defaultRegistryUrls = ['https://www.ruby-lang.org/'];
    
      override readonly customRegistrySupport = false;
    
      override readonly defaultVersioning = rubyVersioningId;
    
      override readonly releaseTimestampSupport = true;
      override readonly releaseTimestampNote =
        'The release timestamp is determined from the `release-list` table in the results.';
      override readonly sourceUrlSupport = 'package';
      override readonly sourceUrlNote =
        'We use the URL: https://github.com/ruby/ruby.';
    
      @cache({ namespace: `datasource-${RubyVersionDatasource.id}`, key: 'all' })
      async getReleases({
        registryUrl,
      }: GetReleasesConfig): Promise<ReleaseResult | null> {
        const res: ReleaseResult = {
          homepage: 'https://www.ruby-lang.org',
          sourceUrl: 'https://github.com/ruby/ruby',
          releases: [],
        };
        // TODO: types (#22198)
        const rubyVersionsUrl = `${registryUrl}en/downloads/releases/`;
        try {
          const response = await this.http.get(rubyVersionsUrl);
    
          const root = parse(response.body);
          const rows =
            root.querySelector('.release-list')?.querySelectorAll('tr') ?? [];
          rows.forEach((row) => {
            const tds = row.querySelectorAll('td');
            const columns: string[] = [];
            tds.forEach((td) => columns.push(td.innerHTML));
            if (columns.length) {
              const version = columns[0].replace('Ruby ', '');
              if (isVersion(version)) {
                const releaseTimestamp = columns[1];
                const changelogUrl = columns[2]
                  .replace('<a href="', 'https://www.ruby-lang.org')
                  .replace('">more...</a>', '');
                res.releases.push({ version, releaseTimestamp, changelogUrl });
              }
            }
          });
          if (!res.releases.length) {
            logger.warn({ registryUrl }, 'Missing ruby releases');
            return null;
          }
        } catch (err) {
          this.handleGenericErrors(err);
        }
    
        return res;
      }
    
      override handleHttpErrors(err: HttpError): never | void {
        throw new ExternalHostError(err);
      }
    }