Source code for boto3_dataclass.pypi

# -*- coding: utf-8 -*-

import json
import dataclasses
from pathlib import Path
from functools import cached_property

import asyncio

from ._version import __version__
from .paths import path_enum
from .utils import write
from .config import config

from .structures.api import Boto3DataclassServiceStructure
from .async_http import fetch_all_urls


def make_url(domain: str, package: str, version: str) -> str:
    return f"{domain}/pypi/{package}/{version}/json"


def extract_package_name_from_url(url: str) -> str:
    parts = url.split("/")
    return parts[-3]


T_PACKAGE_STATUS_INFO = dict[str, bool]


[docs] @dataclasses.dataclass class PackageStatusLoader: version: str = dataclasses.field(default=__version__) @cached_property def path_cache_file(self) -> Path: return path_enum.dir_cache / f"{self.version}.json" def read_cache(self) -> T_PACKAGE_STATUS_INFO: path = self.path_cache_file if path.exists() is False: return self.refresh_cache() return json.loads(path.read_text(encoding="utf-8")) def refresh_cache(self) -> T_PACKAGE_STATUS_INFO: results = asyncio.run(self.fetch_package_infos()) cache_data = {} for result in results: package = extract_package_name_from_url(result.url) if result.error is not None: is_exists = False else: is_exists = "info" in result.response.json() cache_data[package] = is_exists content = json.dumps(cache_data, indent=2) path = self.path_cache_file write(path, content) return cache_data async def fetch_package_infos(self): urls = self.urls results = await fetch_all_urls(urls) return results @cached_property def urls(self) -> list[str]: struct_list = Boto3DataclassServiceStructure.list_all() urls = [ make_url( domain=config.api_domain, package=struct.package_name_slug, version=self.version, ) for struct in struct_list ] return urls