Skip to content

Commit

Permalink
Drop python 3.9 support (#726)
Browse files Browse the repository at this point in the history
* drop python 3.9 support

* update annotations

* import from importlib.resources directly

* web: fix file filter validation

* use more match-case expressions
  • Loading branch information
SoulMelody authored Feb 21, 2025
1 parent c6238a9 commit ba50412
Show file tree
Hide file tree
Showing 149 changed files with 4,059 additions and 4,566 deletions.
2 changes: 1 addition & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ ci:

repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.9.6
rev: v0.9.7
hooks:
- id: ruff
args: [--fix, --exit-non-zero-on-fix, --show-fixes]
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ LibreSVIP is a cross-platform and universal converter for many Singing Voice Syn

Download from github releases: [Releases](https://github.com/SoulMelody/LibreSVIP/releases)

Alternatively, you can install LibreSVIP with desktop support via pip (requires python 3.9+):
Alternatively, you can install LibreSVIP with desktop support via pip (requires python 3.10+):

```bash
pip install libresvip[desktop]
Expand Down
2 changes: 1 addition & 1 deletion docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ LibreSVIP 是一个跨平台且通用的文件转换工具,它适用于多种

从Github发布页下载: [发布页地址](https://github.com/SoulMelody/LibreSVIP/releases)

或者你也可以通过pip安装带有桌面支持的LibreSVIP (需要先安装 python 3.9 以上版本):
或者你也可以通过pip安装带有桌面支持的LibreSVIP (需要先安装 python 3.10 以上版本):

```bash
pip install libresvip[desktop]
Expand Down
12 changes: 6 additions & 6 deletions experimental/dspx/model.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import abc
from typing import Annotated, Any, Literal, Optional, Union
from typing import Annotated, Any, Literal

from pydantic import Field

Expand Down Expand Up @@ -87,7 +87,7 @@ class DspxParamAnchor(BaseModel):
nodes: list[DspxParamNode] = Field(default_factory=list)


DsParamCurve = Annotated[Union[DspxParamFree, DspxParamAnchor], Field(discriminator="type_")]
DsParamCurve = Annotated[DspxParamFree | DspxParamAnchor, Field(discriminator="type_")]


class DspxParam(BaseModel):
Expand Down Expand Up @@ -135,7 +135,7 @@ class DspxPhonemes(BaseModel):

class DspxPronunciation(BaseModel):
original: str = DEFAULT_PHONEME
edited: Optional[str] = None
edited: str | None = None


class DspxNote(HasExtra):
Expand Down Expand Up @@ -168,7 +168,7 @@ class DspxSingingClip(DspxClipMixin, BaseModel):
params: DspxParams = Field(default_factory=DspxParams)


DspxClip = Annotated[Union[DspxAudioClip, DspxSingingClip], Field(discriminator="type_")]
DspxClip = Annotated[DspxAudioClip | DspxSingingClip, Field(discriminator="type_")]


class DspxTrackControl(BaseModel):
Expand All @@ -179,8 +179,8 @@ class DspxTrackControl(BaseModel):


class DspxTrackColor(BaseModel):
color_id: Optional[int] = Field(None, alias="id")
value: Optional[str] = None
color_id: int | None = Field(None, alias="id")
value: str | None = None


class DspxTrack(HasExtra):
Expand Down
58 changes: 29 additions & 29 deletions experimental/xvsq/model.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Optional, Union
from typing import Optional

from pydantic import BaseModel
from xsdata_pydantic.fields import field
Expand Down Expand Up @@ -248,14 +248,14 @@ class ControlLeft(BaseModel):


class ControlRight(BaseModel):
x: Union[float, int] = field(
x: float | int = field(
metadata={
"name": "X",
"type": "Element",
"required": True,
}
)
y: Union[float, int] = field(
y: float | int = field(
metadata={
"name": "Y",
"type": "Element",
Expand Down Expand Up @@ -439,7 +439,7 @@ class L0(BaseModel):
"required": True,
}
)
unknown_float: Union[int, float] = field(
unknown_float: int | float = field(
metadata={
"name": "UnknownFloat",
"type": "Element",
Expand All @@ -453,7 +453,7 @@ class L0(BaseModel):
"required": True,
}
)
consonant_adjustment: Union[int, str] = field(
consonant_adjustment: int | str = field(
metadata={
"name": "ConsonantAdjustment",
"type": "Element",
Expand Down Expand Up @@ -809,7 +809,7 @@ class TimeSigTableEntry(BaseModel):


class UstEvent(BaseModel):
flags: Optional[object] = field(
flags: object | None = field(
default=None,
metadata={
"name": "Flags",
Expand All @@ -823,14 +823,14 @@ class UstEvent(BaseModel):
"required": True,
}
)
properties: Optional[object] = field(
properties: object | None = field(
default=None,
metadata={
"name": "Properties",
"type": "Element",
},
)
lyric: Optional[object] = field(
lyric: object | None = field(
default=None,
metadata={
"name": "Lyric",
Expand Down Expand Up @@ -1894,7 +1894,7 @@ class Meta:
"required": True,
}
)
icon_handle: Optional[IconHandle] = field(
icon_handle: IconHandle | None = field(
default=None,
metadata={
"name": "IconHandle",
Expand Down Expand Up @@ -1950,14 +1950,14 @@ class Meta:
"required": True,
}
)
lyric_handle: Optional[LyricHandle] = field(
lyric_handle: LyricHandle | None = field(
default=None,
metadata={
"name": "LyricHandle",
"type": "Element",
},
)
vibrato_handle: Optional[VibratoHandle] = field(
vibrato_handle: VibratoHandle | None = field(
default=None,
metadata={
"name": "VibratoHandle",
Expand All @@ -1971,7 +1971,7 @@ class Meta:
"required": True,
}
)
note_head_handle: Optional[NoteHeadHandle] = field(
note_head_handle: NoteHeadHandle | None = field(
default=None,
metadata={
"name": "NoteHeadHandle",
Expand Down Expand Up @@ -2005,7 +2005,7 @@ class Meta:
"required": True,
}
)
icon_dynamics_handle: Optional[IconDynamicsHandle] = field(
icon_dynamics_handle: IconDynamicsHandle | None = field(
default=None,
metadata={
"name": "IconDynamicsHandle",
Expand Down Expand Up @@ -2194,112 +2194,112 @@ class BezierCurves(BaseModel):
"required": True,
}
)
vibrato_rate: Optional[object] = field(
vibrato_rate: object | None = field(
default=None,
metadata={
"name": "VibratoRate",
"type": "Element",
},
)
vibrato_depth: Optional[object] = field(
vibrato_depth: object | None = field(
default=None,
metadata={
"name": "VibratoDepth",
"type": "Element",
},
)
harmonics: Optional[object] = field(
harmonics: object | None = field(
default=None,
metadata={
"name": "Harmonics",
"type": "Element",
},
)
fx2_depth: Optional[object] = field(
fx2_depth: object | None = field(
default=None,
metadata={
"name": "FX2Depth",
"type": "Element",
},
)
reso1_freq: Optional[object] = field(
reso1_freq: object | None = field(
default=None,
metadata={
"name": "Reso1Freq",
"type": "Element",
},
)
reso1_bw: Optional[object] = field(
reso1_bw: object | None = field(
default=None,
metadata={
"name": "Reso1BW",
"type": "Element",
},
)
reso1_amp: Optional[object] = field(
reso1_amp: object | None = field(
default=None,
metadata={
"name": "Reso1Amp",
"type": "Element",
},
)
reso2_freq: Optional[object] = field(
reso2_freq: object | None = field(
default=None,
metadata={
"name": "Reso2Freq",
"type": "Element",
},
)
reso2_bw: Optional[object] = field(
reso2_bw: object | None = field(
default=None,
metadata={
"name": "Reso2BW",
"type": "Element",
},
)
reso2_amp: Optional[object] = field(
reso2_amp: object | None = field(
default=None,
metadata={
"name": "Reso2Amp",
"type": "Element",
},
)
reso3_freq: Optional[object] = field(
reso3_freq: object | None = field(
default=None,
metadata={
"name": "Reso3Freq",
"type": "Element",
},
)
reso3_bw: Optional[object] = field(
reso3_bw: object | None = field(
default=None,
metadata={
"name": "Reso3BW",
"type": "Element",
},
)
reso3_amp: Optional[object] = field(
reso3_amp: object | None = field(
default=None,
metadata={
"name": "Reso3Amp",
"type": "Element",
},
)
reso4_freq: Optional[object] = field(
reso4_freq: object | None = field(
default=None,
metadata={
"name": "Reso4Freq",
"type": "Element",
},
)
reso4_bw: Optional[object] = field(
reso4_bw: object | None = field(
default=None,
metadata={
"name": "Reso4BW",
"type": "Element",
},
)
reso4_amp: Optional[object] = field(
reso4_amp: object | None = field(
default=None,
metadata={
"name": "Reso4Amp",
Expand Down
2 changes: 1 addition & 1 deletion libresvip/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import os

__version__ = "1.8.1"
__version__ = "1.9.0"
os.environ.setdefault("LOGURU_AUTOINIT", "false")
2 changes: 1 addition & 1 deletion libresvip/cli/commands/plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ def print_plugin_details(plugin: FormatProviderPluginInfo) -> None:
continue
typer.echo(_("This plugin supports the following {} conversion options:").format(op))
for field_info in options.model_fields.values():
if issubclass(field_info.annotation, (bool, int, float, str, enum.Enum)):
if issubclass(field_info.annotation, bool | int | float | str | enum.Enum):
typer.echo(
"\n "
+ f"{_(field_info.title)} = {field_info.annotation.__name__} {_(field_info.description)}"
Expand Down
4 changes: 2 additions & 2 deletions libresvip/cli/commands/proj.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# mypy: disable-error-code="attr-defined"
import pathlib
from typing import Annotated, Optional, get_type_hints
from typing import Annotated, get_type_hints

import typer
from rich.progress import track
Expand All @@ -14,7 +14,7 @@
app = typer.Typer()


def option_callback(ctx: typer.Context, value: pathlib.Path) -> Optional[pathlib.Path]:
def option_callback(ctx: typer.Context, value: pathlib.Path) -> pathlib.Path | None:
if ctx.resilient_parsing:
return None
ext = value.suffix.lstrip(".").lower()
Expand Down
2 changes: 1 addition & 1 deletion libresvip/cli/prompt.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ def prompt_fields(option_class: BaseModel) -> dict[str, Any]:
translated_title,
default=default_value,
)
elif issubclass(field_info.annotation, (str, Color)):
elif issubclass(field_info.annotation, str | Color):
option_kwargs[option_key] = Prompt.ask(
translated_title,
default=default_value,
Expand Down
12 changes: 2 additions & 10 deletions libresvip/core/compat.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,11 @@
except ImportError:
import zstandard as zstd

__all__ = ["Traversable", "ZipFile", "as_file", "files", "json", "zstd"]

if sys.version_info < (3, 10):
from importlib_resources import as_file, files
else:
from importlib.resources import as_file, files
__all__ = ["Traversable", "ZipFile", "json", "zstd"]

if sys.version_info < (3, 11):
from importlib_resources.abc import Traversable
else:
from importlib.resources.abc import Traversable

if sys.version_info < (3, 11):
from repro_zipfile import ReproducibleZipFile as ZipFile
else:
from importlib.resources.abc import Traversable
from zipfile import ZipFile
Loading

0 comments on commit ba50412

Please sign in to comment.