Skip to content

Commit

Permalink
feat(stubs): add StubRepository for managing stub manifests.
Browse files Browse the repository at this point in the history
  • Loading branch information
BradenM committed Dec 11, 2022
1 parent a9297dc commit 781f7cd
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 1 deletion.
19 changes: 18 additions & 1 deletion micropy/stubs/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,23 @@
"""

from . import source
from .manifest import StubsManifest
from .package import StubPackage
from .repo import StubRepository
from .repo_package import StubRepositoryPackage
from .repositories import MicropyStubPackage, MicropythonStubsManifest, MicropythonStubsPackage
from .repository_info import RepositoryInfo
from .stubs import StubManager

__all__ = ["StubManager", "source"]
__all__ = [
"StubManager",
"source",
"StubsManifest",
"StubPackage",
"StubRepository",
"MicropyStubPackage",
"MicropythonStubsPackage",
"MicropythonStubsManifest",
"RepositoryInfo",
"StubRepositoryPackage",
]
65 changes: 65 additions & 0 deletions micropy/stubs/repo.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
from __future__ import annotations

from typing import TYPE_CHECKING, Generator

import attrs
import requests

from .manifest import StubsManifest
from .repo_package import StubRepositoryPackage

if TYPE_CHECKING:
from .repository_info import RepositoryInfo


@attrs.define
class StubRepository:
manifests: list[StubsManifest] = attrs.field(factory=list)
packages: list[StubRepositoryPackage] = attrs.field(factory=list)

def __attrs_post_init__(self):
self._build_packages()

def _build_packages(self) -> None:
for manifest in self.manifests:
for package in manifest.packages:
self.packages.append(StubRepositoryPackage(repository=manifest, package=package))

def add_repository(self, info: RepositoryInfo) -> StubRepository:
"""Creates a new `StubRepository` instance with a `StubManifest` derived from `info`.
Args:
info: `RepositoryInfo` instance.
Returns:
`StubRepository` instance.
"""
contents = requests.get(info.source).json()
data = dict(repository=info, packages=contents)
for manifest_type in StubsManifest.manifest_formats:
try:
manifest = manifest_type.parse_obj(data)
except (
ValueError,
KeyError,
):
continue
else:
return StubRepository(manifests=[*self.manifests, manifest])
raise ValueError(f"Failed to determine manifest format for repo: {info}")

def search(self, query: str) -> Generator[StubRepositoryPackage, None, None]:
"""Search packages for `query`.
Args:
query: Search constraint.
Returns:
A generator of `StubRepositoryPackage` objects.
"""
query = query.strip().lower()
for package in self.packages:
if query in package.package.name.lower():
yield package

0 comments on commit 781f7cd

Please sign in to comment.