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))
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)
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)