From c79e28ff020644a7253e58dbc8a05d680a97eace Mon Sep 17 00:00:00 2001 From: Roland Date: Mon, 31 Jan 2022 21:45:46 -0700 Subject: [PATCH] Upgrading base packages. Fixing failing test from merge. --- modules/files/api.py | 26 +++++++++++-------------- modules/files/schema.py | 9 ++++++--- modules/videos/channel/api.py | 19 +++++------------- modules/videos/channel/test/test_api.py | 4 +--- requirements.txt | 6 +++--- 5 files changed, 26 insertions(+), 38 deletions(-) diff --git a/modules/files/api.py b/modules/files/api.py index 2d8a8cb6..daa296bc 100644 --- a/modules/files/api.py +++ b/modules/files/api.py @@ -3,11 +3,12 @@ from typing import List from urllib.request import Request from sanic import response +from sanic_ext import validate +from sanic_ext.extensions.openapi import openapi from wrolpi.common import get_media_directory from wrolpi.errors import InvalidFile from wrolpi.root_api import get_blueprint, json_response -from wrolpi.schema import validate_doc from . import lib, schema bp = get_blueprint('Files', '/api/files') @@ -42,12 +43,10 @@ def paths_to_files(paths: List[pathlib.Path]): @bp.post('/') -@validate_doc( - 'List files in a directory', - consumes=schema.FilesRequest, -) -async def get_files(_: Request, data: dict): - directories = data.get('directories') or [] +@openapi.description('List files in a directory') +@validate(schema.FilesRequest) +async def get_files(_: Request, body: schema.FilesRequest): + directories = body.directories or [] files = lib.list_files(directories) files = paths_to_files(files) @@ -55,13 +54,10 @@ async def get_files(_: Request, data: dict): @bp.post('/delete') -@validate_doc( - 'Delete a single file. Returns an error if WROL Mode is enabled.', - consumes=schema.DeleteRequest, -) -async def delete_file(_: Request, data: dict): - file = data.get('file') - if not file: +@openapi.description('Delete a single file. Returns an error if WROL Mode is enabled.') +@validate(schema.DeleteRequest) +async def delete_file(_: Request, body: schema.DeleteRequest): + if not body.file: raise InvalidFile('file cannot be empty') - lib.delete_file(file) + lib.delete_file(body.file) return response.empty() diff --git a/modules/files/schema.py b/modules/files/schema.py index 6b82bb47..8952834c 100644 --- a/modules/files/schema.py +++ b/modules/files/schema.py @@ -1,9 +1,12 @@ -from sanic_openapi import doc +from dataclasses import dataclass, field +from typing import List +@dataclass class FilesRequest: - directories = doc.List(doc.String()) + directories: List[str] = field(default_factory=list) +@dataclass class DeleteRequest: - file = doc.String() + file: str diff --git a/modules/videos/channel/api.py b/modules/videos/channel/api.py index 51065a2b..eff63a74 100644 --- a/modules/videos/channel/api.py +++ b/modules/videos/channel/api.py @@ -8,6 +8,7 @@ from sanic_ext.extensions.openapi import openapi from wrolpi.common import logger, wrol_mode_check, make_media_directory, \ get_media_directory +from wrolpi.errors import UnknownDirectory from wrolpi.root_api import json_response from wrolpi.schema import JSONErrorResponse from .lib import get_minimal_channels, delete_channel, update_channel, get_channel, create_channel @@ -43,19 +44,9 @@ def channel_get(_: Request, link: str): @validate(ChannelPostRequest) @wrol_mode_check def channel_post(_: Request, body: ChannelPostRequest): - try: - # Channel directory is relative to the media directory. Channel directory may not be in "videos" directory! - body.directory = get_media_directory() / body.directory - except UnknownDirectory: - if body.mkdir: - make_media_directory(body.directory) - body.directory = get_relative_to_media_directory(body.directory) - else: - raise - # Channel directory is relative to the media directory. Channel directory may not be in "videos" directory! - data['directory'] = get_media_directory() / data['directory'] - if data.get('mkdir') is True: - make_media_directory(data['directory']) + body.directory = get_media_directory() / body.directory + if not body.directory.is_dir() and body.mkdir: + make_media_directory(body.directory) channel = create_channel(body.__dict__) # TODO don't use the dataclass as a dict. @@ -75,7 +66,7 @@ def channel_post(_: Request, body: ChannelPostRequest): @validate(ChannelPutRequest) @wrol_mode_check def channel_update(_: Request, link: str, body: ChannelPutRequest): - channel = update_channel(body.__dict__, link) + channel = update_channel(body.__dict__, link) # TODO don't use the dataclass as a dict. return response.raw('', HTTPStatus.NO_CONTENT, headers={'Location': f'/api/videos/channels/{channel.link}'}) diff --git a/modules/videos/channel/test/test_api.py b/modules/videos/channel/test/test_api.py index 53d2c6c0..0d00600a 100644 --- a/modules/videos/channel/test/test_api.py +++ b/modules/videos/channel/test/test_api.py @@ -611,9 +611,7 @@ def test_download_channel_no_refresh(test_session, download_channel, video_downl def test_channel_post_directory(test_session, test_client, test_directory): - """ - A Channel can be created with or without an existing directory. - """ + """A Channel can be created with or without an existing directory.""" # Channel can be created with a missing directory. data = dict(name='foo', directory='foo') request, response = test_client.post('/api/videos/channels', content=json.dumps(data)) diff --git a/requirements.txt b/requirements.txt index 3c854436..9e681a9d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,10 +5,10 @@ mock==4.0.3 Pillow==9.0.0 Pint==0.18 psycopg2-binary==2.9.3 -pytest-asyncio==0.17.0 +pytest-asyncio==0.17.2 pytest==6.2.5 pytz==2021.3 -PyYAML==5.3.1 +PyYAML==6.0 requests==2.27.1 sanic-ext==22.1.2 sanic-testing==0.8.2 @@ -18,4 +18,4 @@ SQLAlchemy==1.3.22 srt==3.5.0 websockets==10.1 webvtt-py==0.4.6 -yt-dlp==2021.12.27 +yt-dlp==2022.1.21