diff --git a/kawai_focus/database/cruds.py b/kawai_focus/database/cruds.py index c611484..d11fbab 100644 --- a/kawai_focus/database/cruds.py +++ b/kawai_focus/database/cruds.py @@ -1,6 +1,6 @@ from sqlalchemy import select, insert, update, delete -from kawai_focus.schemas import TimerModel, TimerListModel +from kawai_focus.schemas import TimerModel from kawai_focus.database.session import db from kawai_focus.database.models import Timer from kawai_focus.database.decor_erors import crud_error_guard @@ -26,15 +26,30 @@ def get_timer(timer_id: int) -> TimerModel: @crud_error_guard -def list_timers() -> list[TimerListModel]: +def list_timers() -> list[dict[str, int | str]]: """Функция для получения списка таймеров""" with db.get_session() as session: - query = select(Timer.id, Timer.title) + query = select( + Timer.id, + Timer.title, + Timer.pomodoro_time, + Timer.count_pomodoro + ) result = session.execute(query) timers = result.mappings().fetchall() - return [TimerListModel.model_validate(obj=accept, from_attributes=True) for accept in timers] + return [ + { + 'timer_id': timer.id, + 'text': ( + f'{timer.title}\n' + f'Помидоров: {timer.count_pomodoro}, ' + f'размер помидора: {timer.pomodoro_time}' + ) + } + for timer in timers + ] @crud_error_guard diff --git a/kawai_focus/main.py b/kawai_focus/main.py index 4f3f1c6..46ee47e 100644 --- a/kawai_focus/main.py +++ b/kawai_focus/main.py @@ -10,6 +10,8 @@ import logging from kawai_focus.screens.timer_screen import TimerScreen from kawai_focus.screens.timer_constructor_screen import TimerConstructorScreen +from kawai_focus.screens.timers_screen import TimersScreen +from kawai_focus.database.cruds import list_timers Logger.setLevel(logging.DEBUG) @@ -24,10 +26,16 @@ class KawaiFocusApp(App): # Загрузка kv файла Builder.load_file('kv/timer_screen.kv') Builder.load_file('kv/timer_constructor_screen.kv') + Builder.load_file('kv/timers_screen.kv') screen_manager = ScreenManager() + timers = list_timers() + timers_screen = TimersScreen(name='timers_screen') + timers_screen.ids.timers_view.data = timers + + screen_manager.add_widget(timers_screen) screen_manager.add_widget(TimerConstructorScreen(name='timer_constructor_screen')) - screen_manager.add_widget(TimerScreen(name='timers_screen')) + screen_manager.add_widget(TimerScreen(name='timer_screen')) return screen_manager diff --git a/kawai_focus/screens/timer_constructor_screen.py b/kawai_focus/screens/timer_constructor_screen.py index e86bc4c..352b328 100644 --- a/kawai_focus/screens/timer_constructor_screen.py +++ b/kawai_focus/screens/timer_constructor_screen.py @@ -33,7 +33,7 @@ class TimerConstructorScreen(Screen): ) if timer: - screen_timer = self.manager.get_screen('timers_screen') + screen_timer = self.manager.get_screen('timer_screen') screen_timer.timer = timer time_culc = calculate_time(mm_user=timer.pomodoro_time) screen_timer.timer_start_time = time_culc @@ -42,10 +42,10 @@ class TimerConstructorScreen(Screen): screen_timer.source_timer_names = gen_types_timers(count_pomodoro=timer.count_pomodoro) self.manager.state_machine = screen_timer.source_timer_names.copy() - self.manager.current = 'timers_screen' + self.manager.current = 'timer_screen' def back(self, instance) -> None: """Метод для кнопки назад - возврат в меню таймеров""" - pass + self.manager.current = 'timers_screen' diff --git a/kawai_focus/screens/timer_screen.py b/kawai_focus/screens/timer_screen.py index ac43577..df1d753 100644 --- a/kawai_focus/screens/timer_screen.py +++ b/kawai_focus/screens/timer_screen.py @@ -3,6 +3,7 @@ from kivy.clock import Clock from kivy.core.audio import SoundLoader from kawai_focus.utils.utils import data_json, custom_timer, calculate_time +from kawai_focus.database.cruds import del_timer, list_timers class TimerScreen(Screen): @@ -88,7 +89,30 @@ class TimerScreen(Screen): if not len(self.manager.state_machine): self.manager.state_machine = self.source_timer_names.copy() - self.choice_timer() + self.choice_timer() + + def back(self, instance) -> None: + """Метод для кнопки назад - возврат в меню таймеров""" + + if self.ids.title_warning.text: + self.ids.title_warning.text = '' + self.ids.del_timer.color = (1, 1, 1, 1) + + self.manager.current = 'timers_screen' + + def delete_timer(self, instance) -> None: + """Метод для удаления таймера""" + + if not self.ids.title_warning.text: + self.ids.title_warning.text = ('Вы действительно хотите удалить таймер?\n' + 'Если да, то нажмите кнопку "удалить" ещё раз.') + self.ids.del_timer.color = (1, 0.3, 0.3, 1) + else: + del_timer(timer_id=self.timer.id) + timers = list_timers() + timers_screen = self.manager.get_screen('timers_screen') + timers_screen.ids.timers_view.data = timers + self.manager.current = 'timers_screen' def play_sound(self, dt) -> None: """Метод для воспроизведения звука""" diff --git a/kawai_focus/screens/timers_screen.py b/kawai_focus/screens/timers_screen.py new file mode 100644 index 0000000..583b1c3 --- /dev/null +++ b/kawai_focus/screens/timers_screen.py @@ -0,0 +1,33 @@ +from kivy.uix.screenmanager import Screen + +from kawai_focus.utils.utils import calculate_time, gen_types_timers +from kawai_focus.database.cruds import get_timer + + +class TimersScreen(Screen): + """Экран таймеры""" + + def __init__(self, **kwargs): + super(TimersScreen, self).__init__(**kwargs) + + + def switch_new_timer(self, instance) -> None: + """Метод для переключения на экран Конструктор таймера""" + + self.manager.current = 'timer_constructor_screen' + + + def switch_timer(self, instance) -> None: + """Метод для кнопки переключения на выбранный таймер""" + + timer = get_timer(timer_id=instance.timer_id) + screen_timer = self.manager.get_screen('timer_screen') + screen_timer.timer = timer + time_culc = calculate_time(mm_user=timer.pomodoro_time) + screen_timer.timer_start_time = time_culc + screen_timer.ids.time_label.text = time_culc + screen_timer.ids.title_label.text = timer.title + screen_timer.source_timer_names = gen_types_timers(count_pomodoro=timer.count_pomodoro) + + self.manager.state_machine = screen_timer.source_timer_names.copy() + self.manager.current = 'timer_screen' diff --git a/kv/timer_constructor_screen.kv b/kv/timer_constructor_screen.kv index 4d03a32..7c22d62 100644 --- a/kv/timer_constructor_screen.kv +++ b/kv/timer_constructor_screen.kv @@ -2,7 +2,6 @@ : FloatLayout: - # поле вовода "название" TextInput: id: title size_hint: None, None @@ -19,7 +18,6 @@ height: 20 pos_hint: {"center_x": 0.5, "center_y": 0.8} - # числовой счётчик "время помидора" Label: text: "помидор" size_hint: None, None @@ -46,7 +44,6 @@ pos_hint: {"center_x": 0.7, "center_y": 0.7} on_press: time_tomato_input.increment() - # числовой счётчик "время прерыва" Label: text: "перерыв" size_hint: None, None @@ -73,7 +70,6 @@ pos_hint: {"center_x": 0.7, "center_y": 0.6} on_press: time_break_input.increment() - # числовой счётчик "время длительного перерыва" Label: text: "перерывище" size_hint: None, None @@ -99,8 +95,7 @@ size: 40, 40 pos_hint: {"center_x": 0.7, "center_y": 0.5} on_press: time_long_break_input.increment() - - # числовой счётчик "колличество помидоров" + Label: text: "помидоров" size_hint: None, None @@ -127,20 +122,18 @@ pos_hint: {"center_x": 0.7, "center_y": 0.4} on_press: count_tomatos_input.increment() - # Кнопка "Создать" Button: - text: 'Создать' + text: "Создать" size_hint: None, None height: 40 width: 100 - pos_hint: {'center_x': 0.7, 'center_y': 0.1} + pos_hint: {"center_x": 0.7, "center_y": 0.1} on_press: root.create_timer(self) - # Кнопка "Назад" Button: - text: 'Назад' + text: "Назад" size_hint: None, None height: 40 width: 100 - pos_hint: {'center_x': 0.3, 'center_y': 0.1} + pos_hint: {"center_x": 0.3, "center_y": 0.1} on_press: root.back(self) \ No newline at end of file diff --git a/kv/timer_screen.kv b/kv/timer_screen.kv index c1cb8cb..4b39f9c 100644 --- a/kv/timer_screen.kv +++ b/kv/timer_screen.kv @@ -2,51 +2,71 @@ : FloatLayout: - # Label для названия таймера Label: id: title_label size_hint: None, None - pos_hint: {'center_x': 0.3, 'center_y': 0.7} + pos_hint: {"center_x": 0.3, "center_y": 0.7} - # Label для типа таймера Label: id: type_timer_label - text: 'Помидор' + text: "Помидор" size_hint: None, None - pos_hint: {'center_x': 0.7, 'center_y': 0.7} + pos_hint: {"center_x": 0.7, "center_y": 0.7} - # Кнопка "Старт" Button: - text: 'Старт' + text: "Старт" size_hint: None, None height: 40 width: 100 - pos_hint: {'center_x': 0.3, 'center_y': 0.5} + pos_hint: {"center_x": 0.3, "center_y": 0.5} on_release: root.start_timer(self) - # Кнопка "Пауза" Button: - text: 'Пауза' + text: "Пауза" size_hint: None, None height: 40 width: 100 - pos_hint: {'center_x': 0.5, 'center_y': 0.5} + pos_hint: {"center_x": 0.5, "center_y": 0.5} on_release: root.pause_timer(self) - # Кнопка "Стоп" Button: id: stop_button - text: 'Стоп' + text: "Стоп" opacity: 0 disabled: True size_hint: None, None height: 40 width: 100 - pos_hint: {'center_x': 0.7, 'center_y': 0.5} + pos_hint: {"center_x": 0.7, "center_y": 0.5} on_release: root.stop_timer(self) - # Label для отображения времени Label: id: time_label size_hint: None, None - pos_hint: {'center_x': 0.5, 'center_y': 0.6} \ No newline at end of file + pos_hint: {"center_x": 0.5, "center_y": 0.6} + + Label: + id: title_warning + text: "" + color: (1, 0.3, 0.3, 1) + font_size: 14 + size_hint_y: None + height: 20 + pos_hint: {"center_x": 0.5, "center_y": 0.4} + + Button: + text: "Назад" + size_hint: None, None + height: 40 + width: 100 + pos_hint: {"center_x": 0.3, "center_y": 0.1} + on_press: root.back(self) + + Button: + id: del_timer + text: "Удалить" + size_hint: None, None + height: 40 + width: 120 + pos_hint: {"center_x": 0.7, "center_y": 0.1} + on_press: root.delete_timer(self) \ No newline at end of file diff --git a/kv/timers_screen.kv b/kv/timers_screen.kv new file mode 100644 index 0000000..2df9a4d --- /dev/null +++ b/kv/timers_screen.kv @@ -0,0 +1,49 @@ +#:kivy 2.3.1 + +: + FloatLayout: + RecycleView: + id: timers_view + size_hint: 1, 1 + pos_hint: {"x": 0, "y": 0} + + viewclass: "TimerButton" + + RecycleBoxLayout: + default_size: None, dp(50) + default_size_hint: 1, None + size_hint_y: None + height: self.minimum_height + orientation: "vertical" + spacing: dp(5) + + Button: + id: new_timer + text: 'Новый таймер' + size_hint: None, None + height: 40 + width: 120 + pos_hint: {"center_x": 0.3, "center_y": 0.1} + on_release: root.switch_new_timer(self) + +: + timer_id: None + text: "" + on_release: app.root.get_screen("timers_screen").switch_timer(self) + size_hint: None, None + height: dp(50) + background_normal: "" # отключаем стандартный фон + background_color: 0, 0, 0, 0 # прозрачный + + canvas.before: + Color: + rgba: 1, 1, 1, 1 # белый контур + Line: + width: 1.5 + rectangle: (self.x, self.y, self.width, self.height) + + Color: + rgba: (0, 0.5, 1, 0.5) if self.state == "down" else (0, 0, 0, 0) + Rectangle: + pos: self.pos + size: self.size diff --git a/poetry.lock b/poetry.lock index a22d1fb..b36a1e2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -32,6 +32,33 @@ files = [ {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, ] +[[package]] +name = "asyncgui" +version = "0.6.3" +description = "A thin layer that helps to wrap a callback-style API in an async/await-style API" +optional = false +python-versions = "<4.0.0,>=3.8.1" +groups = ["main"] +files = [ + {file = "asyncgui-0.6.3-py3-none-any.whl", hash = "sha256:46723e65d8bf023e28d141f6a9d38634ef5b97a5236fafdaf80b47e13275a5eb"}, + {file = "asyncgui-0.6.3.tar.gz", hash = "sha256:05de49c2221128d3530f010df98491f3553183ec8909d205a0c0250bee5d6e0c"}, +] + +[[package]] +name = "asynckivy" +version = "0.6.4" +description = "Async library for Kivy" +optional = false +python-versions = "<4.0,>=3.9" +groups = ["main"] +files = [ + {file = "asynckivy-0.6.4-py3-none-any.whl", hash = "sha256:4e26bb6dbc9768d5ca593bae7b36927c06e43915c44b02ddcaa64dc223a2d5e2"}, + {file = "asynckivy-0.6.4.tar.gz", hash = "sha256:58c34876a2422464f39df120b659c8b22e044852dd7ff94c5b9cb9dad84e902b"}, +] + +[package.dependencies] +asyncgui = ">=0.6,<0.7" + [[package]] name = "certifi" version = "2025.1.31" @@ -417,6 +444,31 @@ files = [ [package.dependencies] requests = "*" +[[package]] +name = "kivymd" +version = "2.0.1.dev0" +description = "Set of widgets for Kivy inspired by Google's Material Design" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "master.zip", hash = "sha256:f6dd87020e485c08afc63b5ed80daa2e042d3b77cc52c0fb9e5ff2b392e5948b"}, +] + +[package.dependencies] +asynckivy = ">=0.6,<0.7" +kivy = ">=2.3.0" +materialyoucolor = ">=2.0.7" +pillow = "*" + +[package.extras] +dev = ["black", "coveralls", "flake8", "isort[pyproject]", "pre-commit", "pyinstaller[hook-testing]", "pytest", "pytest-cov", "pytest-timeout", "pytest_asyncio"] +docs = ["sphinx (==7.3.7)", "sphinx-autoapi (==3.0.0)", "sphinx-book-theme", "sphinx-copybutton", "sphinx-notfound-page", "sphinx-tabs"] + +[package.source] +type = "url" +url = "https://github.com/kivymd/KivyMD/archive/master.zip" + [[package]] name = "mako" version = "1.3.10" @@ -508,6 +560,32 @@ files = [ {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, ] +[[package]] +name = "materialyoucolor" +version = "2.0.10" +description = "Material You color generation algorithms in pure python!" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "materialyoucolor-2.0.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4de08ee488369cf0e055ae17ac43c62684f618781939feaf0ad11bc32572a4b6"}, + {file = "materialyoucolor-2.0.10-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ad22b0fb6980e0995d5b8437cad3411f628e1ea88c223c94a20b59d5dbcbacb2"}, + {file = "materialyoucolor-2.0.10-cp310-cp310-win_amd64.whl", hash = "sha256:997787ec4224f3e2d9c90e99d82db746f5581670564a22a0f182ad377e704761"}, + {file = "materialyoucolor-2.0.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e9a4dd1e444a64ea54982be06314ce4611f3c38fdfae2c33cca7d106f6383288"}, + {file = "materialyoucolor-2.0.10-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:144fdd9dca272fee60a1779ce35acf24830cd3bc33ff20982ecba4936cb5bf91"}, + {file = "materialyoucolor-2.0.10-cp311-cp311-win_amd64.whl", hash = "sha256:f126196a051673707297e86b8d0fbd90805a552dc3ac79e1d90442cc3fc877cb"}, + {file = "materialyoucolor-2.0.10-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0fc0b43a684536270177b71bf509b247dab4ff816e49d1ac1b124fc1a32e082e"}, + {file = "materialyoucolor-2.0.10-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7fe5bbc63124c3ea2f5560ea4a5250af72fce9ab55d29925e6bac7c7ec65329d"}, + {file = "materialyoucolor-2.0.10-cp312-cp312-win_amd64.whl", hash = "sha256:aedc8596fd7583fd9e23f3e6d4f7b9defd7d5ef6e7889967814b9900c1e3d5b3"}, + {file = "materialyoucolor-2.0.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:71de9c581c8227c3010c61108a00af9a007c96f99358fdb0628626d0ade817d9"}, + {file = "materialyoucolor-2.0.10-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:978748eca7725d8b569cdecfd9f86a8e34bf946182f79a48b059c98a10f1a0de"}, + {file = "materialyoucolor-2.0.10-cp313-cp313-win_amd64.whl", hash = "sha256:2ffc8963a2f10d8acb6776e60e97f0e7929d3392eb282cf2bc63b8e56cd930b3"}, + {file = "materialyoucolor-2.0.10-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e4827307b1c78897f97f7989237ef688a5c21663a63d327d7cec8e47f107e509"}, + {file = "materialyoucolor-2.0.10-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d8cebae884c6106584e1792b910d9588778353255a1a8156cb634e21f1b8670e"}, + {file = "materialyoucolor-2.0.10-cp39-cp39-win_amd64.whl", hash = "sha256:4c5141fdd973ab386ebd0242072a7faab28d19cc083ee0d14f5b70c31ad75d60"}, + {file = "materialyoucolor-2.0.10.tar.gz", hash = "sha256:31b4d407b9a4fd4b54b30559b0d0313f6d6da1f9d19b75546ed65da52671ea76"}, +] + [[package]] name = "packaging" version = "24.2" @@ -520,6 +598,131 @@ files = [ {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, ] +[[package]] +name = "pillow" +version = "11.3.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pillow-11.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b9c17fd4ace828b3003dfd1e30bff24863e0eb59b535e8f80194d9cc7ecf860"}, + {file = "pillow-11.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:65dc69160114cdd0ca0f35cb434633c75e8e7fad4cf855177a05bf38678f73ad"}, + {file = "pillow-11.3.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7107195ddc914f656c7fc8e4a5e1c25f32e9236ea3ea860f257b0436011fddd0"}, + {file = "pillow-11.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc3e831b563b3114baac7ec2ee86819eb03caa1a2cef0b481a5675b59c4fe23b"}, + {file = "pillow-11.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1f182ebd2303acf8c380a54f615ec883322593320a9b00438eb842c1f37ae50"}, + {file = "pillow-11.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4445fa62e15936a028672fd48c4c11a66d641d2c05726c7ec1f8ba6a572036ae"}, + {file = "pillow-11.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:71f511f6b3b91dd543282477be45a033e4845a40278fa8dcdbfdb07109bf18f9"}, + {file = "pillow-11.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:040a5b691b0713e1f6cbe222e0f4f74cd233421e105850ae3b3c0ceda520f42e"}, + {file = "pillow-11.3.0-cp310-cp310-win32.whl", hash = "sha256:89bd777bc6624fe4115e9fac3352c79ed60f3bb18651420635f26e643e3dd1f6"}, + {file = "pillow-11.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:19d2ff547c75b8e3ff46f4d9ef969a06c30ab2d4263a9e287733aa8b2429ce8f"}, + {file = "pillow-11.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:819931d25e57b513242859ce1876c58c59dc31587847bf74cfe06b2e0cb22d2f"}, + {file = "pillow-11.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1cd110edf822773368b396281a2293aeb91c90a2db00d78ea43e7e861631b722"}, + {file = "pillow-11.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c412fddd1b77a75aa904615ebaa6001f169b26fd467b4be93aded278266b288"}, + {file = "pillow-11.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1aa4de119a0ecac0a34a9c8bde33f34022e2e8f99104e47a3ca392fd60e37d"}, + {file = "pillow-11.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:91da1d88226663594e3f6b4b8c3c8d85bd504117d043740a8e0ec449087cc494"}, + {file = "pillow-11.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:643f189248837533073c405ec2f0bb250ba54598cf80e8c1e043381a60632f58"}, + {file = "pillow-11.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:106064daa23a745510dabce1d84f29137a37224831d88eb4ce94bb187b1d7e5f"}, + {file = "pillow-11.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd8ff254faf15591e724dc7c4ddb6bf4793efcbe13802a4ae3e863cd300b493e"}, + {file = "pillow-11.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:932c754c2d51ad2b2271fd01c3d121daaa35e27efae2a616f77bf164bc0b3e94"}, + {file = "pillow-11.3.0-cp311-cp311-win32.whl", hash = "sha256:b4b8f3efc8d530a1544e5962bd6b403d5f7fe8b9e08227c6b255f98ad82b4ba0"}, + {file = "pillow-11.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:1a992e86b0dd7aeb1f053cd506508c0999d710a8f07b4c791c63843fc6a807ac"}, + {file = "pillow-11.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:30807c931ff7c095620fe04448e2c2fc673fcbb1ffe2a7da3fb39613489b1ddd"}, + {file = "pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4"}, + {file = "pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69"}, + {file = "pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d"}, + {file = "pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6"}, + {file = "pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7"}, + {file = "pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024"}, + {file = "pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809"}, + {file = "pillow-11.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d"}, + {file = "pillow-11.3.0-cp312-cp312-win32.whl", hash = "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149"}, + {file = "pillow-11.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d"}, + {file = "pillow-11.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542"}, + {file = "pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd"}, + {file = "pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8"}, + {file = "pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f"}, + {file = "pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c"}, + {file = "pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd"}, + {file = "pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e"}, + {file = "pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1"}, + {file = "pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805"}, + {file = "pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8"}, + {file = "pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2"}, + {file = "pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b"}, + {file = "pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3"}, + {file = "pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51"}, + {file = "pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580"}, + {file = "pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e"}, + {file = "pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d"}, + {file = "pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced"}, + {file = "pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c"}, + {file = "pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8"}, + {file = "pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59"}, + {file = "pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe"}, + {file = "pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c"}, + {file = "pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788"}, + {file = "pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31"}, + {file = "pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e"}, + {file = "pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12"}, + {file = "pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a"}, + {file = "pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632"}, + {file = "pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673"}, + {file = "pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027"}, + {file = "pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77"}, + {file = "pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874"}, + {file = "pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a"}, + {file = "pillow-11.3.0-cp314-cp314-win32.whl", hash = "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214"}, + {file = "pillow-11.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635"}, + {file = "pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6"}, + {file = "pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae"}, + {file = "pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653"}, + {file = "pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6"}, + {file = "pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36"}, + {file = "pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b"}, + {file = "pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477"}, + {file = "pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50"}, + {file = "pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b"}, + {file = "pillow-11.3.0-cp314-cp314t-win32.whl", hash = "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12"}, + {file = "pillow-11.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db"}, + {file = "pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa"}, + {file = "pillow-11.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:48d254f8a4c776de343051023eb61ffe818299eeac478da55227d96e241de53f"}, + {file = "pillow-11.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7aee118e30a4cf54fdd873bd3a29de51e29105ab11f9aad8c32123f58c8f8081"}, + {file = "pillow-11.3.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:23cff760a9049c502721bdb743a7cb3e03365fafcdfc2ef9784610714166e5a4"}, + {file = "pillow-11.3.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6359a3bc43f57d5b375d1ad54a0074318a0844d11b76abccf478c37c986d3cfc"}, + {file = "pillow-11.3.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:092c80c76635f5ecb10f3f83d76716165c96f5229addbd1ec2bdbbda7d496e06"}, + {file = "pillow-11.3.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cadc9e0ea0a2431124cde7e1697106471fc4c1da01530e679b2391c37d3fbb3a"}, + {file = "pillow-11.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6a418691000f2a418c9135a7cf0d797c1bb7d9a485e61fe8e7722845b95ef978"}, + {file = "pillow-11.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:97afb3a00b65cc0804d1c7abddbf090a81eaac02768af58cbdcaaa0a931e0b6d"}, + {file = "pillow-11.3.0-cp39-cp39-win32.whl", hash = "sha256:ea944117a7974ae78059fcc1800e5d3295172bb97035c0c1d9345fca1419da71"}, + {file = "pillow-11.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:e5c5858ad8ec655450a7c7df532e9842cf8df7cc349df7225c60d5d348c8aada"}, + {file = "pillow-11.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:6abdbfd3aea42be05702a8dd98832329c167ee84400a1d1f61ab11437f1717eb"}, + {file = "pillow-11.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3cee80663f29e3843b68199b9d6f4f54bd1d4a6b59bdd91bceefc51238bcb967"}, + {file = "pillow-11.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b5f56c3f344f2ccaf0dd875d3e180f631dc60a51b314295a3e681fe8cf851fbe"}, + {file = "pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e67d793d180c9df62f1f40aee3accca4829d3794c95098887edc18af4b8b780c"}, + {file = "pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d000f46e2917c705e9fb93a3606ee4a819d1e3aa7a9b442f6444f07e77cf5e25"}, + {file = "pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:527b37216b6ac3a12d7838dc3bd75208ec57c1c6d11ef01902266a5a0c14fc27"}, + {file = "pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be5463ac478b623b9dd3937afd7fb7ab3d79dd290a28e2b6df292dc75063eb8a"}, + {file = "pillow-11.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:8dc70ca24c110503e16918a658b869019126ecfe03109b754c402daff12b3d9f"}, + {file = "pillow-11.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7c8ec7a017ad1bd562f93dbd8505763e688d388cde6e4a010ae1486916e713e6"}, + {file = "pillow-11.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9ab6ae226de48019caa8074894544af5b53a117ccb9d3b3dcb2871464c829438"}, + {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe27fb049cdcca11f11a7bfda64043c37b30e6b91f10cb5bab275806c32f6ab3"}, + {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:465b9e8844e3c3519a983d58b80be3f668e2a7a5db97f2784e7079fbc9f9822c"}, + {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5418b53c0d59b3824d05e029669efa023bbef0f3e92e75ec8428f3799487f361"}, + {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:504b6f59505f08ae014f724b6207ff6222662aab5cc9542577fb084ed0676ac7"}, + {file = "pillow-11.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c84d689db21a1c397d001aa08241044aa2069e7587b398c8cc63020390b1c1b8"}, + {file = "pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=8.2)", "sphinx-autobuild", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +test-arrow = ["pyarrow"] +tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "trove-classifiers (>=2024.10.12)"] +typing = ["typing-extensions ; python_version < \"3.10\""] +xmp = ["defusedxml"] + [[package]] name = "pluggy" version = "1.5.0" @@ -983,5 +1186,5 @@ zstd = ["zstandard (>=0.18.0)"] [metadata] lock-version = "2.1" -python-versions = ">=3.12" -content-hash = "06e55988ae7afe4e5b856a08d6c3b5808c22fcbbd676e818dec76feff71a82e3" +python-versions = ">=3.12,<4.0" +content-hash = "f4698f78aee2e38be26b1230676a01987f41074ce6f181bfbfc6e466f19ef491" diff --git a/pyproject.toml b/pyproject.toml index a643cc3..28bbba9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ authors = [ ] license = {text = "MIT"} readme = "README.md" -requires-python = ">=3.12" +requires-python = ">=3.12,<4.0" dependencies = [ "kivy (>=2.3.1,<3.0.0)", "pytest (>=8.3.5,<9.0.0)", @@ -16,6 +16,7 @@ dependencies = [ "pydantic-settings (>=2.9.1,<3.0.0)", "alembic (>=1.15.2,<2.0.0)", "ruff (>=0.11.8,<0.12.0)", + "kivymd @ https://github.com/kivymd/KivyMD/archive/master.zip", ]