diff --git a/CHANGELOG.md b/CHANGELOG.md index 82e34bb..a452d02 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,16 @@ Before any major/minor/patch bump all unit tests will be run to verify they pass - [x] +## [0.6.0] - 2022-09-03 + +### Added + +- tomli/tomllib compatibility layer to support python 3.10 + +### Removed + +- 3.10 branch + ## [0.6.0] - 2022-08-02 ### Added diff --git a/README.md b/README.md index dd68a68..bf0eadc 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ For an outline of past/future changes refer to: [CHANGELOG](CHANGELOG.md) ## Requirements - [Voicemeeter](https://voicemeeter.com/) -- Python 3.11 or greater +- Python 3.10 or greater ## Installation diff --git a/poetry.lock b/poetry.lock index 13edb6e..61dd497 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,11 +1,3 @@ -[[package]] -name = "atomicwrites" -version = "1.4.1" -description = "Atomic file writes." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - [[package]] name = "attrs" version = "22.1.0" @@ -22,7 +14,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "black" -version = "22.6.0" +version = "22.8.0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -33,6 +25,7 @@ click = ">=8.0.0" mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} [package.extras] colorama = ["colorama (>=0.4.3)"] @@ -102,11 +95,11 @@ pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" [[package]] name = "pathspec" -version = "0.9.0" +version = "0.10.1" description = "Utility library for gitignore style pattern matching of file paths." category = "dev" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = ">=3.7" [[package]] name = "platformdirs" @@ -153,14 +146,13 @@ diagrams = ["railroad-diagrams", "jinja2"] [[package]] name = "pytest" -version = "7.1.2" +version = "7.1.3" description = "pytest: simple powerful testing with Python" category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] -atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} iniconfig = "*" @@ -198,43 +190,18 @@ pytest = ">=3.6" name = "tomli" version = "2.0.1" description = "A lil' TOML parser" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" [metadata] lock-version = "1.1" -python-versions = "^3.11" -content-hash = "13366a58ff2f3fa0de2cb1e3de2f66fff612610fa66bb909201ebaa434cce014" +python-versions = "^3.10" +content-hash = "9f887ae517ade09119bf1f2cf77261d2445ae95857b69470ce1707f9791ce080" [metadata.files] -atomicwrites = [] attrs = [] -black = [ - {file = "black-22.6.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f586c26118bc6e714ec58c09df0157fe2d9ee195c764f630eb0d8e7ccce72e69"}, - {file = "black-22.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b270a168d69edb8b7ed32c193ef10fd27844e5c60852039599f9184460ce0807"}, - {file = "black-22.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6797f58943fceb1c461fb572edbe828d811e719c24e03375fd25170ada53825e"}, - {file = "black-22.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c85928b9d5f83b23cee7d0efcb310172412fbf7cb9d9ce963bd67fd141781def"}, - {file = "black-22.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:f6fe02afde060bbeef044af7996f335fbe90b039ccf3f5eb8f16df8b20f77666"}, - {file = "black-22.6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cfaf3895a9634e882bf9d2363fed5af8888802d670f58b279b0bece00e9a872d"}, - {file = "black-22.6.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94783f636bca89f11eb5d50437e8e17fbc6a929a628d82304c80fa9cd945f256"}, - {file = "black-22.6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:2ea29072e954a4d55a2ff58971b83365eba5d3d357352a07a7a4df0d95f51c78"}, - {file = "black-22.6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e439798f819d49ba1c0bd9664427a05aab79bfba777a6db94fd4e56fae0cb849"}, - {file = "black-22.6.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:187d96c5e713f441a5829e77120c269b6514418f4513a390b0499b0987f2ff1c"}, - {file = "black-22.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:074458dc2f6e0d3dab7928d4417bb6957bb834434516f21514138437accdbe90"}, - {file = "black-22.6.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a218d7e5856f91d20f04e931b6f16d15356db1c846ee55f01bac297a705ca24f"}, - {file = "black-22.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:568ac3c465b1c8b34b61cd7a4e349e93f91abf0f9371eda1cf87194663ab684e"}, - {file = "black-22.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6c1734ab264b8f7929cef8ae5f900b85d579e6cbfde09d7387da8f04771b51c6"}, - {file = "black-22.6.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9a3ac16efe9ec7d7381ddebcc022119794872abce99475345c5a61aa18c45ad"}, - {file = "black-22.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:b9fd45787ba8aa3f5e0a0a98920c1012c884622c6c920dbe98dbd05bc7c70fbf"}, - {file = "black-22.6.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7ba9be198ecca5031cd78745780d65a3f75a34b2ff9be5837045dce55db83d1c"}, - {file = "black-22.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a3db5b6409b96d9bd543323b23ef32a1a2b06416d525d27e0f67e74f1446c8f2"}, - {file = "black-22.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:560558527e52ce8afba936fcce93a7411ab40c7d5fe8c2463e279e843c0328ee"}, - {file = "black-22.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b154e6bbde1e79ea3260c4b40c0b7b3109ffcdf7bc4ebf8859169a6af72cd70b"}, - {file = "black-22.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:4af5bc0e1f96be5ae9bd7aaec219c901a94d6caa2484c21983d043371c733fc4"}, - {file = "black-22.6.0-py3-none-any.whl", hash = "sha256:ac609cf8ef5e7115ddd07d85d988d074ed00e10fbc3445aee393e70164a2219c"}, - {file = "black-22.6.0.tar.gz", hash = "sha256:6c6d39e28aed379aec40da1c65434c77d75e65bb59a1e1c283de545fb4e7c6c9"}, -] +black = [] click = [ {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, @@ -259,10 +226,7 @@ packaging = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, ] -pathspec = [ - {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, - {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, -] +pathspec = [] platformdirs = [ {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, @@ -279,10 +243,7 @@ pyparsing = [ {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, ] -pytest = [ - {file = "pytest-7.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c"}, - {file = "pytest-7.1.2.tar.gz", hash = "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45"}, -] +pytest = [] pytest-randomly = [ {file = "pytest-randomly-3.12.0.tar.gz", hash = "sha256:d60c2db71ac319aee0fc6c4110a7597d611a8b94a5590918bfa8583f00caccb2"}, {file = "pytest_randomly-3.12.0-py3-none-any.whl", hash = "sha256:f4f2e803daf5d1ba036cc22bf4fe9dbbf99389ec56b00e5cba732fb5c1d07fdd"}, diff --git a/pyproject.toml b/pyproject.toml index 9f0534e..319f86f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "voicemeeter-api" -version = "0.6.0" +version = "0.7.0" description = "A Python wrapper for the Voiceemeter API" authors = ["onyx-and-iris "] license = "MIT" @@ -12,7 +12,8 @@ packages = [ ] [tool.poetry.dependencies] -python = "^3.11" +python = "^3.10" +tomli = { version = "^2.0.1", python = "<3.11" } [tool.poetry.dev-dependencies] pytest = "^7.1.2" diff --git a/voicemeeterlib/base.py b/voicemeeterlib/base.py index 199e9c3..8b9f6c6 100644 --- a/voicemeeterlib/base.py +++ b/voicemeeterlib/base.py @@ -3,7 +3,7 @@ import time from abc import abstractmethod from functools import partial from threading import Thread -from typing import Iterable, NoReturn, Optional, Self, Union +from typing import Iterable, NoReturn, Optional, Union from .cbindings import CBindings from .error import CAPIError, VMError @@ -32,7 +32,7 @@ class Remote(CBindings): self.event = Event(self.subs) - def __enter__(self) -> Self: + def __enter__(self): """setup procedures""" self.login() self.init_thread() @@ -242,7 +242,9 @@ class Remote(CBindings): buf = ct.create_string_buffer(1024) res = self.vm_get_midi_message(ct.byref(buf), n) if res > 0: - vals = tuple(grouper(3, (int.from_bytes(buf[i]) for i in range(res)))) + vals = tuple( + grouper(3, (int.from_bytes(buf[i], "little") for i in range(res))) + ) for msg in vals: ch, pitch, vel = msg if not self.midi._channel or self.midi._channel != ch: diff --git a/voicemeeterlib/config.py b/voicemeeterlib/config.py index f27c746..21a7d47 100644 --- a/voicemeeterlib/config.py +++ b/voicemeeterlib/config.py @@ -1,7 +1,10 @@ import itertools from pathlib import Path -import tomllib +try: + import tomllib +except ModuleNotFoundError: + import tomli as tomllib from .kinds import request_kind_map as kindmap @@ -70,7 +73,6 @@ class TOMLStrBuilder: class TOMLDataExtractor: def __init__(self, file): - self._data = dict() with open(file, "rb") as f: self._data = tomllib.load(f) diff --git a/voicemeeterlib/factory.py b/voicemeeterlib/factory.py index 7e1eb90..895cf5c 100644 --- a/voicemeeterlib/factory.py +++ b/voicemeeterlib/factory.py @@ -1,7 +1,7 @@ from abc import abstractmethod from enum import IntEnum from functools import cached_property -from typing import Iterable, NoReturn, Self +from typing import Iterable, NoReturn from . import misc from .base import Remote @@ -51,49 +51,49 @@ class FactoryBuilder: name = name.split("_")[1] print(self._info[int(getattr(self.BuilderProgress, name))]) - def make_strip(self) -> Self: + def make_strip(self): self._factory.strip = tuple( strip(i < self.kind.phys_in, self._factory, i) for i in range(self.kind.num_strip) ) return self - def make_bus(self) -> Self: + def make_bus(self): self._factory.bus = tuple( bus(i < self.kind.phys_out, self._factory, i) for i in range(self.kind.num_bus) ) return self - def make_command(self) -> Self: + def make_command(self): self._factory.command = Command.make(self._factory) return self - def make_macrobutton(self) -> Self: + def make_macrobutton(self): self._factory.button = tuple(MacroButton(self._factory, i) for i in range(80)) return self - def make_vban(self) -> Self: + def make_vban(self): self._factory.vban = vban(self._factory) return self - def make_device(self) -> Self: + def make_device(self): self._factory.device = Device.make(self._factory) return self - def make_option(self) -> Self: + def make_option(self): self._factory.option = misc.Option.make(self._factory) return self - def make_recorder(self) -> Self: + def make_recorder(self): self._factory.recorder = Recorder.make(self._factory) return self - def make_patch(self) -> Self: + def make_patch(self): self._factory.patch = misc.Patch.make(self._factory) return self - def make_fx(self) -> Self: + def make_fx(self): self._factory.fx = misc.FX(self._factory) return self diff --git a/voicemeeterlib/iremote.py b/voicemeeterlib/iremote.py index 01489f9..ffe4d51 100644 --- a/voicemeeterlib/iremote.py +++ b/voicemeeterlib/iremote.py @@ -1,6 +1,5 @@ import time from abc import ABCMeta, abstractmethod -from typing import Self class IRemote(metaclass=ABCMeta): @@ -26,7 +25,7 @@ class IRemote(metaclass=ABCMeta): def identifier(self): pass - def apply(self, data: dict) -> Self: + def apply(self, data: dict): def fget(attr, val): if attr == "mode": return (getattr(self, attr), val, 1)