Beispiel #1
0
  def get(self, owner, repo, version=None):
    self.response.headers['Access-Control-Allow-Origin'] = '*'
    self.response.headers['Content-Type'] = 'application/json'

    library_key = ndb.Key(Library, Library.id(owner, repo))

    if version is None:
      version = yield Library.default_version_for_key_async(library_key)
      if version is None:
        self.response.set_status(404)
        return

    version_key = ndb.Key(Library, library_key.id(), Version, version)

    bower = yield Content.get_by_id_async('bower', parent=version_key)
    if bower is None:
      self.response.set_status(404)
      return

    bower_json = bower.get_json()
    bower_dependencies = bower_json.get('dependencies', {})

    dependencies = []
    version_futures = []
    for name in bower_dependencies.keys():
      dependency = Dependency.from_string(bower_dependencies[name])
      if dependency is None:
        continue
      dependencies.append(dependency)
      dependency_library_key = ndb.Key(Library, Library.id(dependency.owner, dependency.repo))
      version_futures.append(Library.versions_for_key_async(dependency_library_key))

    dependency_futures = []
    for i, dependency in enumerate(dependencies):
      versions = yield version_futures[i]
      def matches(version, spec):
        try:
          return versiontag.match(version, spec)
        except ValueError:
          # FIXME: What other cases do we need to support here?
          return False
      while len(versions) > 0 and not matches(versions[-1], dependency.version):
        versions.pop()
      if len(versions) > 0:
        dependency_library_key = ndb.Key(Library, Library.id(dependency.owner.lower(), dependency.repo.lower()))
        dependency_futures.append(LibraryMetadata.brief_async(dependency_library_key, versions[-1]))

    results = []
    for future in dependency_futures:
      dependency_result = yield future
      if dependency_result is not None:
        results.append(dependency_result)

    result = {
        'results': results,
        'count': len(results),
    }

    self.response.write(json.dumps(result))
Beispiel #2
0
  def full_async(library_key, tag=None, brief=False, assume_latest=False):
    if assume_latest:
      assert tag is not None

    library_future = library_key.get_async()

    if tag is None or not brief or not assume_latest:
      versions_future = Library.versions_for_key_async(library_key)

    if tag is None:
      versions = yield versions_future
      default_version = versiontag.default_version(versions)
      version_key = None if len(versions) == 0 else ndb.Key(Library, library_key.id(), Version, default_version)
    else:
      version_key = ndb.Key(Library, library_key.id(), Version, tag)

    if version_key is not None:
      version_future = version_key.get_async()
      bower_future = Content.get_by_id_async('bower', parent=version_key)
      if not brief:
        readme_future = Content.get_by_id_async('readme.html', parent=version_key)

    library = yield library_future
    if library is None or library.status == Status.suppressed:
      raise ndb.Return(None)

    result = {}
    # Add NPM package fields
    key = library_key.string_id()
    if key.startswith('@'):
      parts = key.split('/')
      if parts[0] != '@@npm':
        result['npmScope'] = parts[0]
        result['npmFullPackage'] = key
      else:
        result['npmFullPackage'] = parts[1]
      result['npmPackage'] = parts[1]

      if library.migrated_from_bower:
        result['migratedFromBower'] = True
    elif library.npm_package:
      result['migratedToNpm'] = library.npm_package

    result['apiKey'] = key
    result['kind'] = library.kind
    result['status'] = library.status
    if library.status != Status.ready:
      if library.status == Status.error:
        result['error'] = library.error
      raise ndb.Return(result)

    version = None
    if version_key is not None:
      version = yield version_future

    if version is None:
      raise ndb.Return(None)

    result['spdx_identifier'] = library.spdx_identifier
    result['version'] = version.key.id()
    if version.status != Status.ready:
      result['status'] = version.status
      if version.status == Status.error:
        result['error'] = version.error
      raise ndb.Return(result)

    if not brief or not assume_latest:
      versions = yield versions_future
      result['versions'] = versions
      if len(versions) > 0:
        result['default_version'] = versiontag.default_version(versions)
        # Remove latest_version once deployed clients all use default_version
        result['latest_version'] = versiontag.default_version(versions)

    if not brief and library.participation is not None:
      result['activity'] = json.loads(library.participation).get('all', [])

    if not brief and library.contributors is not None:
      contributors = []
      raw = json.loads(library.contributors)
      for contributor in raw:
        contributors.append({
            'login': contributor['login'],
            'avatar_url': contributor['avatar_url'],
            'contributions': contributor['contributions'],
        })
      result['contributors'] = contributors

    if library.metadata is not None:
      metadata = json.loads(library.metadata)
      result['description'] = metadata.get('description', '')
      result['subscribers'] = metadata.get('subscribers_count', 0)
      result['stars'] = metadata.get('stargazers_count', 0)
      result['forks'] = metadata.get('forks', 0)
      result['open_issues'] = metadata.get('open_issues', 0)
      result['updated_at'] = metadata.get('updated_at', 0)
      result['owner'] = metadata['owner']['login']
      result['avatar_url'] = metadata['owner'].get('avatar_url', '')
      result['repo'] = metadata['name']
      if metadata.get('homepage') and re.match(r'https?', metadata.get('homepage')):
        result['homepage'] = metadata['homepage']
      result['default_branch'] = metadata.get('default_branch', 'master')

    if not brief:
      readme = yield readme_future
      result['readme'] = None if readme is None else readme.content

    bower = yield bower_future
    if bower is not None:
      bower_json = bower.get_json()
      dependencies = bower_json.get('dependencies', {})
      result['dependency_count'] = len(dependencies)
      result['bower'] = {
          'license': bower_json.get('license', ''),
          'dependencies': dependencies,
          'keywords': bower_json.get('keywords', []),
          'demos': bower_json.get('demos', {}),
          'pages': bower_json.get('pages', {}),
      }
      if result.get('description', '') == '':
        result['description'] = bower_json.get('description', '')

    raise ndb.Return(result)
Beispiel #3
0
    def full_async(library_key, tag=None, brief=False, assume_latest=False):
        if assume_latest:
            assert tag is not None

        library_future = library_key.get_async()

        if tag is None or not brief or not assume_latest:
            versions_future = Library.versions_for_key_async(library_key)

        if tag is None:
            versions = yield versions_future
            default_version = versiontag.default_version(versions)
            version_key = None if len(versions) == 0 else ndb.Key(
                Library, library_key.id(), Version, default_version)
        else:
            version_key = ndb.Key(Library, library_key.id(), Version, tag)

        if version_key is not None:
            version_future = version_key.get_async()
            bower_future = Content.get_by_id_async('bower', parent=version_key)
            if not brief:
                readme_future = Content.get_by_id_async('readme.html',
                                                        parent=version_key)

        library = yield library_future
        if library is None or library.status == Status.suppressed:
            raise ndb.Return(None)

        result = {}
        result['kind'] = library.kind
        result['status'] = library.status
        if library.status != Status.ready:
            if library.status == Status.error:
                result['error'] = library.error
            raise ndb.Return(result)

        version = None
        if version_key is not None:
            version = yield version_future

        if version is None:
            raise ndb.Return(None)

        result['spdx_identifier'] = library.spdx_identifier
        result['version'] = version.key.id()
        if version.status != Status.ready:
            result['status'] = version.status
            if version.status == Status.error:
                result['error'] = version.error
            raise ndb.Return(result)

        if not brief or not assume_latest:
            versions = yield versions_future
            result['versions'] = versions
            if len(versions) > 0:
                result['default_version'] = versiontag.default_version(
                    versions)
                # Remove latest_version once deployed clients all use default_version
                result['latest_version'] = versiontag.default_version(versions)

        if not brief and library.participation is not None:
            result['activity'] = json.loads(library.participation).get(
                'all', [])

        if not brief and library.contributors is not None:
            contributors = []
            raw = json.loads(library.contributors)
            for contributor in raw:
                contributors.append({
                    'login':
                    contributor['login'],
                    'avatar_url':
                    contributor['avatar_url'],
                    'contributions':
                    contributor['contributions'],
                })
            result['contributors'] = contributors

        if library.metadata is not None:
            metadata = json.loads(library.metadata)
            result['description'] = metadata['description']
            result['subscribers'] = metadata['subscribers_count']
            result['stars'] = metadata['stargazers_count']
            result['forks'] = metadata['forks']
            result['open_issues'] = metadata['open_issues']
            result['updated_at'] = metadata['updated_at']
            result['owner'] = metadata['owner']['login']
            result['avatar_url'] = metadata['owner']['avatar_url']
            result['repo'] = metadata['name']
            result['homepage'] = metadata['homepage']
            result['default_branch'] = metadata['default_branch']

        if not brief:
            readme = yield readme_future
            result['readme'] = None if readme is None else readme.content

        bower = yield bower_future
        if bower is not None:
            bower_json = json.loads(bower.content)
            dependencies = bower_json.get('dependencies', [])
            result['dependency_count'] = len(dependencies)
            result['bower'] = {
                'license': bower_json.get('license', ''),
                'dependencies': dependencies,
                'keywords': bower_json.get('keywords', []),
            }
            if result.get('description', '') == '':
                result['description'] = bower_json.get('description', '')

        raise ndb.Return(result)