Bastian Blank: Python dataclasses for Deb822 format
Python includes some helping support for classes that are designed to just hold some data and not much more: Data Classes.
It uses plain Python type definitions to specify what you can have and some further information for every field.
This will then generate you some useful methods, like
Class definition start
Data classes are just normal classes, just with a decorator.
Field definitions
You need to specify the exact key to be used for this field.
Default values are also supported.
Reading files
Full example
Known limitations
__init__
and __repr__
, but on request also more.
But given that those type definitions are available to other code, a lot more can be done.
There exists several separate packages to work on data classes.
For example you can have data validation from JSON with dacite.
But Debian likes a pretty strange format usually called Deb822, which is in fact derived from the RFC 822 format of e-mail messages.
Those files includes single messages with a well known format.
So I'd like to introduce some Deb822 format support for Python Data Classes.
For now the code resides in the Debian Cloud tool.
Usage
Setup
It uses the standard data classes support and several helper functions.
Also you need to enable support for postponed evaluation of annotations.
from __future__ import annotations
from dataclasses import dataclass
from dataclasses_deb822 import read_deb822, field_deb822
@dataclass
class Package:
package: str = field_deb822('Package')
version: str = field_deb822('Version')
arch: str = field_deb822('Architecture')
multi_arch: Optional[str] = field_deb822(
'Multi-Arch',
default=None,
)
for p in read_deb822(Package, sys.stdin, ignore_unknown=True):
print(p)
from __future__ import annotations
from dataclasses import dataclass
from debian_cloud_images.utils.dataclasses_deb822 import read_deb822, field_deb822
from typing import Optional
import sys
@dataclass
class Package:
package: str = field_deb822('Package')
version: str = field_deb822('Version')
arch: str = field_deb822('Architecture')
multi_arch: Optional[str] = field_deb822(
'Multi-Arch',
default=None,
)
for p in read_deb822(Package, sys.stdin, ignore_unknown=True):
print(p)
- Needs postponed evaluation of annotations.
- Does not allow for different case of keys.
- Fields are stored with continuation character embedded (aka: text\n text').