Example #1
0
 def test_list_versions(self):
     """ Listing package versions should return api call """
     self.request.registry.use_fallback = False
     pkg = Package('mypkg', '1.1', 'mypkg-1.1.tar.gz', datetime.utcnow())
     self.request.db.upload(pkg.name, pkg.version, pkg.path, None)
     context = SimplePackageResource(self.request, 'mypkg')
     result = package_versions(context, self.request)
     self.assertEqual(result, {'pkgs': [pkg]})
Example #2
0
File: gcs.py Project: twu/pypicloud
 def package_from_object(cls, obj, factory):
     """Create a package from a GCS object"""
     filename = posixpath.basename(obj.name)
     if obj.metadata is None:
         return None
     name = obj.metadata.get("name")
     version = obj.metadata.get("version")
     if name is None or version is None:
         return None
     metadata = Package.read_metadata(obj.metadata)
     return factory(name, version, filename, obj.updated, path=obj.name, **metadata)
Example #3
0
 def test_list_versions(self):
     """ Listing package versions should return api call """
     self.request.registry.use_fallback = False
     pkg = Package('mypkg', '1.1', 'mypkg-1.1.tar.gz', datetime.utcnow())
     self.request.db.upload(pkg.filename, None)
     context = SimplePackageResource(self.request, 'mypkg')
     self.request.app_url = MagicMock()
     result = package_versions(context, self.request)
     self.assertEqual(result,
                      {'pkgs': {
                          pkg.filename: self.request.app_url()
                      }})
Example #4
0
    def list(self, factory=Package):
        # List does not return metadata :(
        for blob_properties in self.container_client.list_blobs(
                name_starts_with=self.path_prefix):
            blob_client = self.container_client.get_blob_client(
                blob=blob_properties.name)
            metadata = blob_client.get_blob_properties()

            yield factory(metadata.metadata["name"],
                          metadata.metadata["version"],
                          posixpath.basename(blob_properties.name),
                          blob_properties.last_modified,
                          path=blob_properties.name,
                          **Package.read_metadata(metadata.metadata))
Example #5
0
 def test_upload(self):
     """Uploading package sets metadata and sends to S3"""
     package = make_package(requires_python="3.6")
     datastr = b"foobar"
     data = BytesIO(datastr)
     self.storage.upload(package, data)
     key = list(self.bucket.objects.all())[0].Object()
     contents = BytesIO()
     key.download_fileobj(contents)
     self.assertEqual(contents.getvalue(), datastr)
     self.assertEqual(key.metadata["name"], package.name)
     self.assertEqual(key.metadata["version"], package.version)
     self.assertEqual(key.metadata["summary"], package.summary)
     self.assertDictContainsSubset(package.get_metadata(),
                                   Package.read_metadata(key.metadata))
Example #6
0
    def package_from_object(cls, obj, factory):
        """ Create a package from a S3 object """
        filename = posixpath.basename(obj.key)
        name = obj.metadata.get("name")
        version = obj.metadata.get("version")
        metadata = Package.read_metadata(obj.metadata)
        # We used to not store metadata. This is for backwards
        # compatibility
        if name is None or version is None:
            try:
                name, version = parse_filename(filename)
            except ValueError:
                LOG.warning("S3 file %s has no package name", obj.key)
                return None

        return factory(
            name, version, filename, obj.last_modified, path=obj.key, **metadata
        )
Example #7
0
    def list(self, factory=Package):
        try:
            headers, objects = self.client.get_container(
                self.container, headers={'user-agent': USER_AGENT})
        except ClientException as e:
            if e.http_status == 404:
                LOG.warning('Container was removed')
                create_container(self.client, self.container,
                                 self.storage_policy)
                return
            LOG.error('Error while listing container: %s', e)
            raise HTTPInternalServerError()

        for obj_info in objects:
            object_path = obj_info['name']
            if object_path.endswith('.meta'):
                continue
            try:
                name, version, filename = object_path.split('/', 3)
            except ValueError:
                LOG.warning('The object is not like a package: %s', obj_info)
                continue
            last_modified = datetime.strptime(obj_info['last_modified'],
                                              '%Y-%m-%dT%H:%M:%S.%f')
            object_meta_path = self.path_to_meta_path(object_path)
            try:
                # Get package metadata from object
                headers, data = self.client.get_object(
                    self.container,
                    object_meta_path,
                    headers={'user-agent': USER_AGENT})
            except ClientException as e:
                if e.http_status != 404:
                    LOG.warning('Can\'t get package metadata "%s": %s',
                                object_meta_path, e)
                    continue
                else:
                    # metadata stored in old place
                    metadata = self._get_old_metadata(object_path)
            else:
                metadata = json.loads(data)
            metadata = Package.read_metadata(metadata or {})

            yield factory(name, version, filename, last_modified, **metadata)
Example #8
0
 def new_package(self, *args, **kwargs) -> Package:
     return Package(*args, **kwargs)
def document_to_package(snap):
    doc = snap.to_dict()
    return Package(doc["name"], doc["version"], snap.id,
                   doc["last_modified"].replace(tzinfo=None), doc["summary"],
                   **doc["metadata"])
Example #10
0
def make_package(name='a', version='b', path='path/to/file.tar.gz',
                 last_modified=datetime.utcnow()):
    """ Convenience method for constructing a package """
    return Package(name, version, path, last_modified)