Skip to content

Commit

Permalink
feat: add beet.contrib.strip_final_newlines
Browse files Browse the repository at this point in the history
  • Loading branch information
vberlier committed Sep 14, 2022
1 parent 5f15226 commit f1f4b9a
Show file tree
Hide file tree
Showing 8 changed files with 74 additions and 0 deletions.
50 changes: 50 additions & 0 deletions beet/contrib/strip_final_newlines.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
"""Plugin that strips final newlines in text files."""


__all__ = [
"StripFinalNewlinesSerializer",
"StripFinalNewlinesOptions",
"strip_final_newlines",
]


from dataclasses import dataclass
from typing import Any, Callable

from pydantic import BaseModel

from beet import Context, ListOption, TextFileBase, configurable


class StripFinalNewlinesOptions(BaseModel):
extensions: ListOption[str] = ListOption()


def beet_default(ctx: Context):
ctx.require(strip_final_newlines)


@dataclass
class StripFinalNewlinesSerializer:
"""Wrap existing serializer and strip final newline."""

serializer: Callable[[Any], str]

def __call__(self, content: Any) -> str:
raw = self.serializer(content)
if raw.endswith("\n"):
raw = raw[:-1]
return raw


@configurable(validator=StripFinalNewlinesOptions)
def strip_final_newlines(ctx: Context, opts: StripFinalNewlinesOptions):
"""Plugin that strips final newlines in text files."""
for pack in ctx.packs:
for _, text_file in pack.list_files(
*opts.extensions.entries(),
extend=TextFileBase[Any],
):
text_file.serializer = StripFinalNewlinesSerializer(text_file.serializer)
if isinstance(raw := text_file.get_content(), str) and raw.endswith("\n"):
text_file.text = raw[:-1]
4 changes: 4 additions & 0 deletions examples/load_strip_final_newlines/beet.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
data_pack:
load: "src"
pipeline:
- beet.contrib.strip_final_newlines
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
say hello
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"values": ["demo:foo"]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
say hello
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"values": ["demo:foo"]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"pack": {
"pack_format": 10,
"description": ""
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"pack": {
"pack_format": 9,
"description": ""
}
}

0 comments on commit f1f4b9a

Please sign in to comment.