Skip to content

Commit

Permalink
feat: deflate by default and make compression configurable
Browse files Browse the repository at this point in the history
  • Loading branch information
vberlier committed Mar 9, 2022
1 parent c47ce91 commit 03f487d
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 3 deletions.
35 changes: 33 additions & 2 deletions beet/library/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
"NamespaceProxyDescriptor",
"MergeCallback",
"MergePolicy",
"PACK_COMPRESSION",
]


Expand Down Expand Up @@ -48,7 +49,7 @@
get_origin,
overload,
)
from zipfile import ZipFile
from zipfile import ZIP_BZIP2, ZIP_DEFLATED, ZIP_LZMA, ZIP_STORED, ZipFile

from beet.core.container import (
Container,
Expand All @@ -74,6 +75,14 @@
PackFile = File[Any, Any]


PACK_COMPRESSION: Dict[str, int] = {
"none": ZIP_STORED,
"deflate": ZIP_DEFLATED,
"bzip2": ZIP_BZIP2,
"lzma": ZIP_LZMA,
}


class NamespaceFile(PackFile):
"""Base class for files that belong in pack namespaces."""

Expand Down Expand Up @@ -606,6 +615,8 @@ class Pack(MatchMixin, MergeMixin, Container[str, NamespaceType]):
name: Optional[str]
path: Optional[Path]
zipped: bool
compression: Optional[str]
compression_level: Optional[int]

extra: PackExtraContainer["Pack[NamespaceType]"]
mcmeta: ExtraPin[JsonFile] = ExtraPin(
Expand Down Expand Up @@ -635,6 +646,8 @@ def __init__(
path: Optional[FileSystemPath] = None,
zipfile: Optional[ZipFile] = None,
zipped: bool = False,
compression: Optional[str] = None,
compression_level: Optional[int] = None,
mcmeta: Optional[JsonFile] = None,
icon: Optional[PngFile] = None,
description: Optional[str] = None,
Expand All @@ -648,6 +661,8 @@ def __init__(
self.name = name
self.path = None
self.zipped = zipped
self.compression = compression
self.compression_level = compression_level

self.extra = PackExtraContainer()
self.extra.bind(self)
Expand Down Expand Up @@ -904,6 +919,8 @@ def save(
directory: Optional[FileSystemPath] = None,
path: Optional[FileSystemPath] = None,
zipped: Optional[bool] = None,
compression: Optional[str] = None,
compression_level: Optional[int] = None,
overwrite: Optional[bool] = False,
) -> Path:
"""Save the pack at the specified location."""
Expand All @@ -915,8 +932,22 @@ def save(

if zipped is not None:
self.zipped = zipped
if compression is not None:
self.compression = compression
if compression_level is not None:
self.compression_level = compression_level

suffix = ".zip" if self.zipped else ""
factory: Any = partial(ZipFile, mode="w") if self.zipped else nullcontext
factory: Any = (
partial(
ZipFile,
mode="w",
compression=PACK_COMPRESSION[self.compression or "deflate"],
compresslevel=self.compression_level,
)
if self.zipped
else nullcontext
)

if not directory:
directory = self.path or Path.cwd()
Expand Down
12 changes: 11 additions & 1 deletion beet/toolchain/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from copy import deepcopy
from itertools import chain
from pathlib import Path
from typing import Any, Dict, Iterable, List, Optional, Union
from typing import Any, Dict, Iterable, List, Literal, Optional, Union

import toml
import yaml
Expand All @@ -40,6 +40,8 @@ class PackConfig(BaseModel):
description: TextComponent = ""
pack_format: int = 0
zipped: Optional[bool] = None
compression: Optional[Literal["none", "deflate", "bzip2", "lzma"]] = None
compression_level: Optional[int] = None

load: Union[str, List[str]] = Field(default_factory=list)
render: Dict[str, List[str]] = Field(default_factory=dict)
Expand All @@ -54,6 +56,14 @@ def with_defaults(self, other: "PackConfig") -> "PackConfig":
description=self.description or other.description,
pack_format=self.pack_format or other.pack_format,
zipped=other.zipped if self.zipped is None else self.zipped,
compression=(
other.compression if self.compression is None else self.compression
),
compression_level=(
other.compression_level
if self.compression_level is None
else self.compression_level
),
load=([other.load] if isinstance(other.load, str) else other.load)
+ ([self.load] if isinstance(self.load, str) else self.load),
render={
Expand Down
4 changes: 4 additions & 0 deletions beet/toolchain/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -295,13 +295,17 @@ def bootstrap(self, ctx: Context):
description=pack.description or description,
pack_format=pack.pack_format,
zipped=pack.zipped,
compression=pack.compression,
compression_level=pack.compression_level,
)
)

pack.name = ctx.template.render_string(config.name)
pack.description = ctx.template.render_json(config.description)
pack.pack_format = config.pack_format
pack.zipped = bool(config.zipped)
pack.compression = config.compression
pack.compression_level = config.compression_level

def __call__(self, ctx: Context):
"""The builder instance is itself a plugin used for merging subpipelines."""
Expand Down

0 comments on commit 03f487d

Please sign in to comment.