Skip to content

Commit

Permalink
Allow information on removed collections.
Browse files Browse the repository at this point in the history
  • Loading branch information
felixfontein committed Sep 20, 2024
1 parent 467923c commit d5366c6
Show file tree
Hide file tree
Showing 3 changed files with 89 additions and 2 deletions.
2 changes: 2 additions & 0 deletions changelogs/fragments/173-schema-removal.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
minor_changes:
- "Allow information on removed collections in collection metadata schema (https://github.com/ansible-community/antsibull-core/pull/173)."
68 changes: 67 additions & 1 deletion src/antsibull_core/collection_meta.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
CollectionMetadata,
CollectionsMetadata,
RemovalInformation,
RemovedCollectionMetadata,
)

if t.TYPE_CHECKING:
Expand Down Expand Up @@ -75,7 +76,45 @@ def _validate_collection(
if meta.removal:
self._validate_removal(collection, meta.removal, f"{prefix} removal ->")

def validate(self, data: CollectionsMetadata) -> None:
def _validate_removal_for_removed(
self, collection: str, removal: RemovalInformation, prefix: str
) -> None:
if removal.major_version == "TBD":
self.errors.append(f"{prefix} major_version: Must not be 'TBD'")
elif removal.major_version != self.major_release:
self.errors.append(
f"{prefix} major_version: Removal major version {removal.major_version} must"
f" be current major version {self.major_release}"
)

if (
removal.announce_version is not None
and removal.announce_version.major >= self.major_release
):
self.errors.append(
f"{prefix} announce_version: Major version of {removal.announce_version}"
f" must be less than the current major version {self.major_release}"
)

if removal.reason == "renamed" and removal.new_name == collection:
self.errors.append(f"{prefix} new_name: Must not be the collection's name")

def _validate_removed_collection(
self, collection: str, meta: RemovedCollectionMetadata, prefix: str
) -> None:
if meta.repository is None:
self.errors.append(f"{prefix} repository: Required field not provided")

self._validate_removal_for_removed(
collection, meta.removal, f"{prefix} removal ->"
)
if meta.removed_version.major != self.major_release:
self.errors.append(
f"{prefix} removed_version: Major version of {meta.removed_version}"
f" must be the current major version {self.major_release}"
)

def _validate_collections(self, data: CollectionsMetadata) -> None:
# Check order
sorted_list = sorted(data.collections)
raw_list = list(data.collections)
Expand Down Expand Up @@ -105,6 +144,33 @@ def validate(self, data: CollectionsMetadata) -> None:
for collection in sorted(remaining_collections):
self.errors.append(f"collections: No metadata present for {collection}")

def _validate_removed_collections(self, data: CollectionsMetadata) -> None:
# Check order
sorted_list = sorted(data.removed_collections)
raw_list = list(data.removed_collections)
if raw_list != sorted_list:
for raw_entry, sorted_entry in zip(raw_list, sorted_list):
if raw_entry != sorted_entry:
self.errors.append(
"The removed collection list must be sorted; "
f"{sorted_entry!r} must come before {raw_entry}"
)
break

# Validate removed collection data
for collection, removed_meta in data.removed_collections.items():
if collection in self.all_collections:
self.errors.append(
f"removed_collections -> {collection}: Collection in ansible.in"
)
self._validate_removed_collection(
collection, removed_meta, f"removed_collections -> {collection} ->"
)

def validate(self, data: CollectionsMetadata) -> None:
self._validate_collections(data)
self._validate_removed_collections(data)


def lint_collection_meta(
*, collection_meta_path: StrPath, major_release: int, all_collections: list[str]
Expand Down
21 changes: 20 additions & 1 deletion src/antsibull_core/schemas/collection_meta.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ def _check_reason_is_not_renamed(self) -> Self:
return self


class CollectionMetadata(p.BaseModel):
class BaseCollectionMetadata(p.BaseModel):
"""
Stores metadata about one collection.
"""
Expand All @@ -124,15 +124,34 @@ class CollectionMetadata(p.BaseModel):
repository: t.Optional[str] = None
tag_version_regex: t.Optional[str] = None
maintainers: list[str] = []


class CollectionMetadata(BaseCollectionMetadata):
"""
Stores metadata about one collection.
"""

removal: t.Optional[RemovalInformation] = None


class RemovedCollectionMetadata(BaseCollectionMetadata):
"""
Stores metadata about a removed collection.
"""

model_config = p.ConfigDict(arbitrary_types_allowed=True)

removal: RemovalInformation
removed_version: PydanticPypiVersion


class CollectionsMetadata(p.BaseModel):
"""
Stores metadata about a set of collections.
"""

collections: dict[str, CollectionMetadata]
removed_collections: dict[str, RemovedCollectionMetadata] = {}

@staticmethod
def load_from(deps_dir: StrPath | None) -> CollectionsMetadata:
Expand Down

0 comments on commit d5366c6

Please sign in to comment.