badges/shields · error · InvalidResponse

no versions found

Error message

no versions found

What it means

This InvalidResponse error is thrown by the piwheels version badge transform when, after filtering out yanked releases and releases with no wheels, zero releases remain. The piwheels API responded successfully, but there is no publishable release to display.

Source

Thrown at services/piwheels/piwheels-version.service.js:84

  }

  static transform(releases, includePrereleases) {
    const allReleases = Object.keys(releases)
      .reduce(
        (acc, key) =>
          acc.concat({
            version: key,
            prerelease: releases[key].prerelease,
            yanked: releases[key].yanked,
            hasFiles: Object.keys(releases[key].files).length > 0,
          }),
        [],
      )
      .filter(release => !release.yanked) // exclude any yanked releases
      .filter(release => release.hasFiles) // exclude any releases with no wheels

    if (allReleases.length === 0) {
      throw new InvalidResponse({ prettyMessage: 'no versions found' })
    }

    if (includePrereleases) {
      return allReleases[0].version
    }

    const stableReleases = allReleases.filter(release => !release.prerelease)
    if (stableReleases.length > 0) {
      return stableReleases[0].version
    }
    return allReleases[0].version
  }

  async handle({ wheel }, queryParams) {
    const includePrereleases = queryParams.include_prereleases !== undefined
    const { releases } = await this.fetch({ wheel })
    const version = this.constructor.transform(releases, includePrereleases)
    return this.constructor.render({ version })

View on GitHub (pinned to 766fd8bc89)

Solutions

  1. Verify the package name is correct and exists on PyPI/piwheels
  2. Check whether the package's releases are all yanked or lack wheels on piwheels.org
  3. Wait for piwheels to build wheels for a newly released package, then re-request
  4. Use the PyPI version badge instead if the package is not distributed via piwheels

Example fix

// before
/piwheels/version/nonexistent-package
// after
/piwheels/version/rpi-gpio
Defensive patterns

Strategy: try-catch

Validate before calling

const data = await fetchPiwheelsReleases(pkg)
const publishable = Object.values(data.releases || {}).filter(r => !r.yanked && r.hasFiles)
if (publishable.length === 0) throw new Error('No publishable (non-yanked, wheeled) releases on piwheels')

Type guard

function hasPublishableReleases(piwheelsData) {
  return typeof piwheelsData === 'object' && piwheelsData !== null &&
    Object.values(piwheelsData.releases || {}).some(r => !r.yanked && r.hasFiles)
}

Try / catch

try {
  const version = await piwheelsVersion(pkg)
} catch (e) {
  if (e instanceof InvalidResponse && e.message === 'no versions found') return { label: 'piwheels', message: 'no releases', color: 'lightgrey' }
  throw e
}

Prevention

When it happens

Trigger: Querying a piwheels package badge for a project whose every release is yanked or has no built wheels (no ARM-compatible wheels published on piwheels), or a package name with no releases at all.

Common situations: Newly published packages piwheels has not built yet; packages whose wheels were all yanked; typos in the package name leading to an empty result; pure-Python-only packages not built by piwheels.

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.

Related errors


AI-assisted analysis of badges/shields@766fd8bc89 (2026-08-30). Data as JSON: /api/errors/a0a8e7f11ff0c59c. Report an issue: GitHub.