docs: def _read_zip(self, filepath):
          """
          Read an IPS installation zipfile and return the core version number
          @type   filepath:   str
          @rtype: LooseVersion
          """
          with ZipFile(filepath) as zip:
              namelist = zip.namelist()
              if re.match(r'^\d+/?$', namelist[0]):
                  self.log.debug('Developer Tools directory matched: %s', namelist[0])
                  version_id = namelist[0].strip('/')
              else:
                  basename = os.path.basename(filepath)
                  match = re.match('^IPS_Developer_Tools_v(\d+).zip$', basename)
                  if match:
                      self.log.info('Could not parse dev_tools archive, pulling version id from filename instead')
                      version_id = match.group(1)
                  else:
                      self.log.error('No developer tools directory matched, unable to continue')
                      raise BadZipfile('Unrecognized dev tools file format, aborting')
  
              if version_id not in self.ips_versions:
                  raise BadZipfile('Unrecognized version ID (is the dev tools package newer than our latest IPS release?)')
              version = self.ips_versions[version_id]
  
              self.log.debug('Version matched: %s', version)
              return Version(version, version_id)