package_checks: output dep lists with proper offset (#3928)

**Summary**

Change loader/dumper to ruamel to enable putting out dependency lists
with proper offset and colon spacing. This way the output can directly
be copied and pasted into the recipe.

Note: I couldn't find a way to do this with pyyaml; Dumper
implementation [adopted from ruamel
docs](https://yaml.readthedocs.io/en/latest/example/#output-of-dump-as-a-string).
I also couldn't get `top_level_colon_align` to work for some reason, so
in cases of very short subpackage names with dependencies the colon
might be placed too far to the left (not 100% sure if there is such a
case in the repo; the "^g++" case happens to perfectly align)

Resolves https://github.com/getsolus/packages/issues/3924

**Test Plan**

Old output `budgie-desktop-branding`:
```
- breeze-cursor-theme
- budgie-backgrounds
- budgie-desktop
- font-hack-ttf
- livecd:
  - budgie-desktop-branding
  - test
- materia-gtk-theme
- materia-gtk-theme-dark
- noto-sans-ttf
- noto-serif-ttf
- papirus-icon-theme
- qtstyleplugins
- solus-artwork
- test
```

New output `budgie-desktop-branding`:
```
    - breeze-cursor-theme
    - budgie-backgrounds
    - budgie-desktop
    - font-hack-ttf
    - livecd :
        - budgie-desktop-branding
        - test
    - materia-gtk-theme
    - materia-gtk-theme-dark
    - noto-sans-ttf
    - noto-serif-ttf
    - papirus-icon-theme
    - qtstyleplugins
    - solus-artwork
    - test
```

Old output `gcc` rundeps:
```
- ^g++: gcc
- ^gfortran:
  - gcc
  - libgfortran
- ^libgcc-32bit: libgcc
- ^libgfortran-32bit: libgfortran
- ^libgomp-32bit:
  - libgcc-32bit
  - libgomp
- ^libstdc++-32bit: libstdc++
- mpc
- mpfr
- test
```

New output `gcc` rundeps:
```
    - ^g++ : gcc
    - ^gfortran :
        - gcc
        - libgfortran
    - ^libgcc-32bit : libgcc
    - ^libgfortran-32bit : libgfortran
    - ^libgomp-32bit :
        - libgcc-32bit
        - libgomp
    - ^libstdc++-32bit : libstdc++
    - mpc
    - mpfr
    - test
```

**Checklist**

- [x] Package was built and tested against unstable
This commit is contained in:
Silke Hofstra 2024-10-24 13:05:45 +02:00 committed by GitHub
commit 34d5cba3d5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 26 additions and 8 deletions

View file

@ -11,12 +11,12 @@ import sys
from dataclasses import dataclass
from datetime import datetime, timezone
from enum import Enum
from ruamel.yaml import YAML
from ruamel.yaml.compat import StringIO
from typing import Any, Callable, Dict, List, Optional, TextIO, Tuple, Union
from urllib import request
from xml.etree import ElementTree
import yaml
"""Package is either a Package YML file or Pspec XML file."""
Package = Union['PackageYML', 'PspecXML']
@ -30,7 +30,9 @@ class PackageYML:
"""Represents a Package YML file."""
def __init__(self, stream: Any):
self._data = dict(yaml.safe_load(stream))
yaml = YAML(typ='safe', pure=True)
yaml.default_flow_style = False
self._data = dict(yaml.load(stream))
@property
def name(self) -> str:
@ -105,7 +107,8 @@ class Config:
@staticmethod
def load(stream: Any) -> 'Config':
return Config(**yaml.safe_load(stream))
yaml = YAML(typ='safe', pure=True)
return Config(**yaml.load(stream))
def __post_init__(self) -> None:
self.freeze = FreezeConfig(**self.freeze) # type: ignore
@ -409,7 +412,9 @@ class Homepage(PullRequestCheck):
def _includes_homepage(self, file: str) -> bool:
with self._open(file) as f:
return 'homepage' in yaml.safe_load(f)
yaml = YAML(typ='safe', pure=True)
yaml.default_flow_style = False
return 'homepage' in yaml.load(f)
class PackageBumped(PullRequestCheck):
@ -467,8 +472,18 @@ class PackageDependenciesOrder(PullRequestCheck):
exp = self._sorted(cur)
if cur != exp:
class Dumper(YAML):
def dump(self, data: Any, stream: Optional[StringIO] = None, **kw: int) -> Any:
self.default_flow_style = False
self.indent(offset=4, sequence=4)
self.prefix_colon = ' ' # type: ignore[assignment]
stream = StringIO()
YAML.dump(self, data, stream, **kw)
return stream.getvalue()
yaml = Dumper(typ='safe', pure=True)
return Result(file=file, level=self._level, line=self.file_line(file, '^' + deps + r'\s*:'),
message=f'{deps} are not in order, expected: \n' + yaml.safe_dump(exp))
message=f'{deps} are not in order, expected: \n' + yaml.dump(exp))
return None