Exemple #1
0
    def get(self, owner, repo, ver=None):
        self.response.headers['Access-Control-Allow-Origin'] = '*'
        owner = owner.lower()
        repo = repo.lower()
        library_key = ndb.Key(Library, Library.id(owner, repo))
        if ver is None:
            ver = yield Library.latest_version_for_key_async(library_key)
        if ver is None:
            self.response.set_status(404)
            return
        version_key = ndb.Key(Library, Library.id(owner, repo), Version, ver)
        analysis = Content.get_by_id('analysis',
                                     parent=version_key,
                                     read_policy=ndb.EVENTUAL_CONSISTENCY)

        if analysis is None:
            self.response.set_status(404)
            return

        self.response.headers['Content-Type'] = 'application/json'
        result = {}
        result['status'] = analysis.status
        if analysis.status == Status.ready:
            result['content'] = json.loads(analysis.content)
        if analysis.status == Status.error:
            result['error'] = analysis.error

        if result['status'] != Status.ready:
            self.response.set_status(400)

        self.response.headers['Content-Type'] = 'application/json'
        self.response.write(json.dumps(result))
Exemple #2
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.latest_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)

        collection_versions = yield Version.collections_for_key_async(
            version_key)
        collection_futures = []
        for collection_version in collection_versions:
            collection_futures.append(
                LibraryMetadata.brief_async(collection_version.key.parent(),
                                            collection_version.key.id()))
        collections = []
        for future in collection_futures:
            collection_result = yield future
            if collection_result is not None:
                collections.append(collection_result)

        result = {
            'results': collections,
            'count': len(collections),
        }
        self.response.write(json.dumps(result))
Exemple #3
0
    def handle_get(self, owner, repo):
        library_key = ndb.Key(Library, Library.id(owner, repo))
        version = Library.latest_version_for_key_async(
            library_key).get_result()
        if version is None:
            return self.error('no versions for %s' % Library.id(owner, repo))

        bower_key = ndb.Key(Library, Library.id(owner, repo), Version, version,
                            Content, 'bower')
        bower_object = bower_key.get()
        bower = {} if bower_object is None else json.loads(
            bower_object.content)
        version_key = bower_key.parent()
        library = version_key.parent().get()

        self.update_search_index(owner, repo, version_key, library, bower)

        if library.kind == 'collection':
            self.update_collection_dependencies(version_key, bower)

        latest_version = Library.latest_version_for_key_async(
            library_key).get_result()
        if latest_version is not None and latest_version != version:
            return self.retry('latest version changed while updating indexes')
Exemple #4
0
    def handle_post(self):
        message_json = json.loads(
            urllib.unquote(self.request.body).rstrip('='))
        message = message_json['message']
        data = base64.b64decode(str(message['data']))
        attributes = message['attributes']
        owner = attributes['owner']
        repo = attributes['repo']
        version = attributes['version']
        error = attributes.get('error', None)

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

        content = Content.get_by_id('analysis', parent=version_key)
        if content is None:
            return
        if data == '':
            content.content = None
        elif len(data) > 500000:
            # Max entity size is only 1MB.
            logging.error('content was too large: %d %s %s', len(data),
                          Library.id(owner, repo), version)
            error = 'content was too large: %d' % len(data)
        else:
            content.content = data

        if error is None:
            content.status = Status.ready
            content.error = None
        else:
            content.status = Status.error
            content.error = error

        content.put()

        if version_key.id() == Library.latest_version_for_key_async(
                version_key.parent()).get_result():
            task_url = util.update_indexes_task(owner, repo)
            util.new_task(task_url, target='manage')
Exemple #5
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.latest_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 = json.loads(bower.content)
        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))