canonical / snapcraft

Package, distribute, and update any app for Linux and IoT.
https://snapcraft.io
GNU General Public License v3.0
1.17k stars 441 forks source link

Redesign Project models #4885

Open mr-cal opened 4 days ago

mr-cal commented 4 days ago

What needs to get done

Create a base Project model and a set of inherited models for each base and snap type.

Some pseudocode from @lengau:

class Project: ...

class BaseProject(Project): 
    type: Literal["base"]
    build-base: BaseEnum
class AppProject(Project):
    base: BaseEnum
class BareProject(AppProject):
    base: BaseEnum.BARE
class Core22Project(AppProject):
    base: BaseEnum.CORE22
class Core22KernelProject(Core22Project):
    type: kernel

UnionAppProject = ...
UnionKernelProject = ...
SnapcraftProject = Annotated[
    BaseProject | SnapdProject | GadgetProject | UnionAppProject | UnionKernelProject,
    Field(discriminator="type")
]

Why it needs to get done

Snapcraft has a single Project model with declarative validation like "if base is core24, then architectures is not allowed".

This needs a more sophisticated approach: