Source code for conda_pypi.index
"""
Interface to conda-index.
"""
from typing import Any
from conda_index.index import ChannelIndex
from conda_index.index.cache import BaseCondaIndexCache
from conda_pypi.exceptions import UnableToConvertToRepodataEntry
from conda_pypi.pypi_metadata import pypi_to_repodata
[docs]
def update_index(path):
channel_index = ChannelIndex(
path,
None,
threads=1,
debug=False,
write_bz2=False,
write_zst=True,
write_run_exports=True,
compact_json=True,
write_current_repodata=False,
)
channel_index.index(patch_generator=None)
channel_index.update_channeldata()
[docs]
def store_pypi_metadata(cache: BaseCondaIndexCache, pypi_json: dict[str, Any]):
"""Convert and cache a single pypi package as a conda repodata entry.
Starting in conda-index 0.11.0, conda index can output repodata v3, including
wheel packages.
This function takes the output from the PyPI API and converts it to a conda repodata entry.
For example,
```
def cache_repodata_entry(cache: BaseCondaIndexCache, name: str, version: str) -> dict[str, Any] | None:
pypi_endpoint = f"https://pypi.org/pypi/{name}/{version}/json"
pypi_data = requests.get(pypi_endpoint)
if pypi_data.json() is None:
raise Exception(f"unable to process {name} {version}")
store_pypi_metadata(cache, pypi_data.json())
```
"""
repodata_entry = pypi_to_repodata(pypi_json)
if repodata_entry is None:
raise UnableToConvertToRepodataEntry(
"Unable to find a pure python wheel and convert it to a repodata entry"
)
path = f"{repodata_entry['name']}-{repodata_entry['version']}-py3_none_any_0.whl"
cache.store_fs_state(
[
{
"path": cache.database_path(path),
"size": repodata_entry["size"],
"mtime": repodata_entry.get("timestamp", 0),
}
]
)
# must contain sha256 and md5 keys but values may be None
if not repodata_entry.get("sha256"):
raise ValueError(
f"PyPI payload for {repodata_entry.get('name')!r} is missing a sha256 digest"
)
repodata_entry.setdefault("md5", None)
cache.store(
fn=path,
size=repodata_entry["size"],
mtime=repodata_entry.get("timestamp", 0),
members={},
index_json=repodata_entry,
)