Skip to content

Commit 05c1320

Browse files
committed
load queries from a directory
1 parent 15e80e6 commit 05c1320

File tree

6 files changed

+95
-9
lines changed

6 files changed

+95
-9
lines changed

litequery/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from litequery.core import setup
22

33

4-
__version__ = "0.1.0"
4+
__version__ = "0.2.0"
55
__all__ = ["setup"]

litequery/core.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import glob
2+
import os
13
from enum import Enum
24
import re
35
from contextlib import asynccontextmanager
@@ -21,8 +23,8 @@ class Query:
2123
op: Op = Op.SELECT
2224

2325

24-
def parse_queries(path):
25-
with open(path) as f:
26+
def parse_file_queries(file_path):
27+
with open(file_path) as f:
2628
content = f.read()
2729
raw_queries = re.findall(r"-- name: (.+)\n([\s\S]*?);", content)
2830

@@ -40,7 +42,18 @@ def parse_queries(path):
4042
args = re.findall(r":(\w+)", sql)
4143
query = Query(name=query_name, sql=sql, args=args, op=op)
4244
queries.append(query)
45+
return queries
46+
4347

48+
def parse_queries(path):
49+
queries = []
50+
if os.path.isdir(path):
51+
for file_path in glob.glob(os.path.join(path, "*.sql")):
52+
queries.extend(parse_file_queries(file_path))
53+
elif os.path.isfile(path):
54+
queries.extend(parse_file_queries(path))
55+
else:
56+
raise ValueError(f"Path {path} is neither a file nor a directory.")
4457
return queries
4558

4659

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
44

55
[project]
66
name = "litequery"
7-
version = "0.1.0"
7+
version = "0.2.0"
88
authors = [{ name = "Dima Charnyshou", email = "[email protected]" }]
99
description = "A handy way to interact with an SQLite database from Python"
1010
readme = "README.md"

tests/queries/events.sql

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
-- name: get_all_events
2+
select
3+
*
4+
from
5+
events;
6+

tests/queries/users.sql

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
-- name: get_all_users
2+
select
3+
*
4+
from
5+
users;
6+
7+
-- name: get_user_by_id^
8+
select
9+
*
10+
from
11+
users
12+
where
13+
id = :id;
14+
15+
-- name: get_last_user_id$
16+
select
17+
id
18+
from
19+
users
20+
order by
21+
id desc;
22+
23+
-- name: insert_user<!
24+
insert into users (name, email)
25+
values (:name, :email);
26+
27+
-- name: delete_all_users!
28+
delete from users;
29+

tests/test_litequery.py

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,47 @@
44
import litequery
55
import pytest_asyncio
66

7+
from litequery.core import parse_queries
8+
79
DATABASE_PATH = "users.db"
8-
QUERIES_PATH = "tests/queries.sql"
10+
QUERIES_FILE_PATH = "tests/queries.sql"
11+
QUERIES_DIR_PATH = "tests/queries/"
912

1013

1114
@pytest_asyncio.fixture
1215
async def setup_database():
1316
async with aiosqlite.connect(DATABASE_PATH) as conn:
1417
await conn.execute(
15-
"create table users (id integer primary key autoincrement, name text not null, email text not null)"
18+
"""
19+
create table users (
20+
id integer primary key autoincrement,
21+
name text not null,
22+
email text not null
23+
)
24+
"""
25+
)
26+
await conn.execute(
27+
"""
28+
create table events (
29+
id integer primary key autoincrement,
30+
user_id integer not null,
31+
name text not null,
32+
created_at datetime not null default current_timestamp,
33+
foreign key (user_id) references users (id)
34+
)
35+
"""
36+
)
37+
await conn.execute(
38+
"insert into users (id, name, email) values (1, 'Alice', '[email protected]')"
39+
)
40+
await conn.execute(
41+
"insert into users (id, name, email) values (2, 'Bob', '[email protected]')"
1642
)
1743
await conn.execute(
18-
"insert into users (name, email) values ('Alice', '[email protected]')"
44+
"insert into events (user_id, name) values (1, 'user_logged_in')"
1945
)
2046
await conn.execute(
21-
"insert into users (name, email) values ('Bob', '[email protected]')"
47+
"insert into events (user_id, name) values (2, 'password_changed')"
2248
)
2349
await conn.commit()
2450
yield
@@ -27,12 +53,24 @@ async def setup_database():
2753

2854
@pytest_asyncio.fixture
2955
async def lq(setup_database):
30-
lq = litequery.setup(DATABASE_PATH, QUERIES_PATH)
56+
lq = litequery.setup(DATABASE_PATH, QUERIES_DIR_PATH)
3157
await lq.connect()
3258
yield lq
3359
await lq.disconnect()
3460

3561

62+
@pytest.mark.asyncio
63+
async def test_parse_queries_from_file():
64+
queries = parse_queries(QUERIES_FILE_PATH)
65+
assert len(queries) == 5
66+
67+
68+
@pytest.mark.asyncio
69+
async def test_parse_queries_from_directory():
70+
queries = parse_queries(QUERIES_DIR_PATH)
71+
assert len(queries) == 6
72+
73+
3674
@pytest.mark.asyncio
3775
async def test_get_all_users(lq):
3876
users = await lq.get_all_users()

0 commit comments

Comments
 (0)