diff --git a/inconnu/roleplay/search.py b/inconnu/roleplay/search.py index 37c2ee0..c699b42 100644 --- a/inconnu/roleplay/search.py +++ b/inconnu/roleplay/search.py @@ -4,8 +4,6 @@ from datetime import datetime, timezone import discord -from dateutil.parser import ParserError -from dateutil.parser import parse as parse_dt from discord.ext.pages import Paginator from pymongo import DESCENDING @@ -55,7 +53,7 @@ async def search( dt_query["$lt"] = before if dt_query: query["date"] = dt_query - except (ValueError, ParserError) as err: + except (ValueError, SyntaxError) as err: await inconnu.utils.error(ctx, err, title="Invalid date") return @@ -119,18 +117,20 @@ def convert_dates(after: str, before: str) -> tuple[datetime, datetime]: ValueError if before is after after. ParserError if a datetime can't be inferred.""" - def convert_tzs(dt: datetime) -> datetime: + def convert_tzs(dt: str | None) -> datetime: """If the datetime has a timezone, convert it to UTC and remove it.""" - if dt.tzinfo is None: - return dt - return dt.astimezone(timezone.utc).replace(tzinfo=None) - - # NOTE: In a future dateutil version, this will raise an exception if the - # timezone can't be inferred. - if after: - after = convert_tzs(parse_dt(after)) - if before: - before = convert_tzs(parse_dt(before)) + if dt is None: + return None + try: + dt = datetime.strptime(dt, "%Y%m%d") + if dt.tzinfo is None: + return dt + return dt.astimezone(timezone.utc).replace(tzinfo=None) + except ValueError as err: + raise SyntaxError(f"Invalid date: `{dt}`.\nAccepted format: YYYYMMDD.") from err + + after = convert_tzs(after) + before = convert_tzs(before) if before and after: if before <= after: diff --git a/poetry.lock b/poetry.lock index 6c8e33c..1e2c2ca 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1681,21 +1681,6 @@ pytest = ">=6.1.0" docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy (>=0.931)", "pytest-trio (>=0.7.0)"] -[[package]] -name = "python-dateutil" -version = "2.8.2" -description = "Extensions to the standard Python datetime module" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, -] - -[package.dependencies] -six = ">=1.5" - [[package]] name = "python-dotenv" version = "0.21.1" @@ -2145,4 +2130,4 @@ multidict = ">=4.0" [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "89c81b152acd9c95d13c79d9df36563d29b95ae9847230b468f5b6486ff44b29" +content-hash = "e39ea81c86127815211580544ea866dd0b39ca3c26df2daaad0fcc0185d3d0dc" diff --git a/pyproject.toml b/pyproject.toml index 1ef6377..3b0e279 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,7 +31,6 @@ fastapi = "^0.100.0" aiocache = "^0.12.1" py-cord = "^2.4.1" pyparsing = "^3.1.1" -python-dateutil = "^2.8.2" [tool.poetry.dev-dependencies] debugpy = "^1.6.3" diff --git a/tests/test_misc.py b/tests/test_misc.py index 6562ccd..7fdd5e3 100644 --- a/tests/test_misc.py +++ b/tests/test_misc.py @@ -124,13 +124,17 @@ def test_dyscrasias(res): @pytest.mark.parametrize( "after,before,exp_b,exp_a,error", [ - ("2023-10-10", "2023-11-10", dt(2023, 10, 10), dt(2023, 11, 10), False), - ("2023-10-10", "2023-9-10", None, None, True), + (None, None, None, None, False), + (None, "20231110", None, dt(2023, 11, 10), False), + ("20231010", None, dt(2023, 10, 10), None, False), + ("20231010", "20231110", dt(2023, 10, 10), dt(2023, 11, 10), False), + ("20231010", "20230910", None, None, ValueError), # Date mismatch + ("Bad date", "20231010", None, None, SyntaxError), ], ) -def test_convert_dates(after: str, before: str, exp_b: dt, exp_a: dt, error: bool): +def test_convert_dates(after: str, before: str, exp_b: dt, exp_a: dt, error: Exception | None): if error: - with pytest.raises(ValueError): + with pytest.raises(error): b, a = convert_dates(after, before) else: b, a = convert_dates(after, before)