|
15 | 15 | import readme_renderer.markdown
|
16 | 16 | import readme_renderer.rst
|
17 | 17 | import readme_renderer.txt
|
| 18 | +import simple_repository |
18 | 19 | from simple_repository import SimpleRepository, model
|
| 20 | +import simple_repository.errors |
19 | 21 |
|
20 | 22 |
|
21 | 23 | @dataclasses.dataclass
|
@@ -153,21 +155,39 @@ def _create_files_info_mapping(
|
153 | 155 | return files_info
|
154 | 156 |
|
155 | 157 |
|
| 158 | +class MinimalDistribution(pkginfo.Distribution): |
| 159 | + def __init__(self, name: str, summary: str): |
| 160 | + super().__init__() # Get all the default None values |
| 161 | + self.name = name |
| 162 | + self.summary = summary |
| 163 | + |
| 164 | + |
156 | 165 | async def _fetch_metadata_resource(
|
157 | 166 | repository: SimpleRepository,
|
158 | 167 | project_name: str,
|
159 | 168 | file: model.File,
|
160 | 169 | tmp_file_path: str,
|
161 | 170 | ) -> tuple[model.File, pkginfo.Distribution]:
|
162 | 171 | """Fetch metadata resource and return updated file and package info."""
|
163 |
| - if file.dist_info_metadata: |
164 |
| - resource_name = file.filename + ".metadata" |
165 |
| - else: |
166 |
| - raise ValueError(f"Metadata not available for {file}") |
| 172 | + if not file.dist_info_metadata: |
| 173 | + # No metadata available for this file type (e.g., .egg files) |
| 174 | + # Return a minimal distribution object with basic info |
| 175 | + ext = file.filename.rsplit(".", 1)[-1] |
| 176 | + reason = f"Legacy package format ({ext}) - metadata not available" |
| 177 | + minimal_dist = MinimalDistribution(project_name, summary=reason) |
| 178 | + return file, minimal_dist |
| 179 | + |
| 180 | + resource_name = file.filename + ".metadata" |
167 | 181 |
|
168 | 182 | logging.debug(f"Downloading metadata for {file.filename} from {resource_name}")
|
169 | 183 |
|
170 |
| - resource = await repository.get_resource(project_name, resource_name) |
| 184 | + try: |
| 185 | + resource = await repository.get_resource(project_name, resource_name) |
| 186 | + except simple_repository.errors.ResourceUnavailable as err: |
| 187 | + reason = f"Unable to retrieve metadata for {file.filename} ({err})" |
| 188 | + minimal_dist = MinimalDistribution(project_name, summary=reason) |
| 189 | + logging.exception(reason) |
| 190 | + return file, minimal_dist |
171 | 191 |
|
172 | 192 | if isinstance(resource, model.TextResource):
|
173 | 193 | with open(tmp_file_path, "wb") as tmp:
|
|
0 commit comments