Skip to content

Commit 94e9c0e

Browse files
committed
Fix typing problems
1 parent 8f74beb commit 94e9c0e

File tree

4 files changed

+51
-24
lines changed

4 files changed

+51
-24
lines changed

conftest.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,29 @@
11
import os
2+
from typing import Generator
3+
24
import pytest
5+
from flask.testing import FlaskClient
6+
from peewee import SqliteDatabase
7+
from py.path import local # type: ignore
38

49
os.environ["SNAPBIN_TESTING"] = "true"
510
# pylint: disable=wrong-import-position
11+
from snapbin import database
612
from snapbin import main
713
from snapbin.models.secret import Secret
814

915

1016
@pytest.fixture(scope="function")
11-
def memory_db():
12-
main.db.init(":memory:")
13-
main.db.connect()
14-
main.db.create_tables([Secret])
15-
yield main.db
16-
main.db.close()
17+
def memory_db() -> Generator[SqliteDatabase, None, None]:
18+
database.db.init(":memory:")
19+
database.db.connect()
20+
database.db.create_tables([Secret])
21+
yield database.db
22+
database.db.close()
1723

1824

1925
@pytest.fixture()
20-
def app(tmpdir):
26+
def app(tmpdir: local) -> FlaskClient:
2127
temp_directory = tmpdir.mkdir("db")
2228
main.initialize_db(db_path=f"{temp_directory}/test.db")
2329
main.app.config["TESTING"] = True

flake.nix

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,23 @@
4747
# The editable root passed as a string
4848
root = "$DEVENV_ROOT/snapbin"; # Use environment variable expansion at runtime
4949
};
50+
types-peewee =
51+
let
52+
pname = "types-peewee";
53+
version = "3.18.1.20250516";
54+
in
55+
pyfinal.buildPythonPackage {
56+
inherit pname version;
57+
format = "setuptools";
58+
src = pkgs.fetchurl {
59+
url = "https://files.pythonhosted.org/packages/9c/21/65fd9a10a988cc93afe5de22c0c7cffa2e20e9b31a3b964f78769f7d90c9/types_peewee-3.18.1.20250516.tar.gz";
60+
hash = "sha256-wUMNUM9oZnUZhLrUYVSOXBYUNYJ9sSB2pXp5qrFyzC8=";
61+
};
62+
63+
# Module doesn't have tests
64+
doCheck = false;
65+
pythonImportsCheck = [ "peewee-stubs" ];
66+
};
5067
};
5168
};
5269

@@ -68,6 +85,7 @@
6885
p.python-lsp-server
6986
p.ruff
7087
p.snapbin-editable
88+
p.types-peewee
7189
]);
7290
pythonProd = pkgs.python312.withPackages (p: [
7391
p.cryptography

snapbin/main.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# mypy: disable-error-code="no-untyped-call"
12
import os
23
import uuid
34
from typing import Any
@@ -69,7 +70,7 @@ def encrypt(password: str) -> tuple[bytes, bytes]:
6970
return encrypted_password, encryption_key
7071

7172

72-
def decrypt(password: bytes, decryption_key: bytes):
73+
def decrypt(password: bytes, decryption_key: bytes) -> bytes:
7374
"""
7475
Decrypt a password (bytes) using the provided key (bytes),
7576
and return the plain-text password (bytes).
@@ -125,7 +126,7 @@ def get_password(token: str) -> str | None:
125126
if password is not None:
126127
if decryption_key is not None:
127128
password = decrypt(password, decryption_key)
128-
return password.decode("utf-8")
129+
return str(password.decode("utf-8"))
129130
return None
130131
except DoesNotExist:
131132
return None
@@ -168,7 +169,7 @@ def clean_input(form_request: Request = request) -> tuple[int, str]:
168169

169170

170171
@app.route("/", methods=["POST"])
171-
def handle_password():
172+
def handle_password() -> Response:
172173
if request.is_json:
173174
request.form = request.get_json()
174175
ttl, password = clean_input(form_request=request)
@@ -177,7 +178,7 @@ def handle_password():
177178

178179

179180
@app.route("/get-secret", methods=["POST"])
180-
def show_password():
181+
def show_password() -> Response:
181182
if request.is_json:
182183
request.form = request.get_json()
183184
if empty(request.form.get("key", "")):
@@ -189,7 +190,7 @@ def show_password():
189190
return jsonify(password=password)
190191

191192

192-
def main():
193+
def main() -> None:
193194
db_path = os.environ.get("DB_PATH", "snapbin.db")
194195
initialize_db(db_path=db_path)
195196
app.run(host="0.0.0.0")

tests.py

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,26 @@
1+
# mypy: disable-error-code="no-untyped-call"
12
import time
23

34
import pytest
4-
55
from cryptography.fernet import Fernet
6+
from flask.testing import FlaskClient
67
from freezegun import freeze_time
8+
from peewee import SqliteDatabase
79
from werkzeug.exceptions import BadRequest
810

911
import snapbin.main as snap
1012
from snapbin.models.secret import Secret
1113

1214

13-
def test_get_password(memory_db):
15+
def test_get_password(memory_db: SqliteDatabase) -> None:
1416
_ = memory_db
1517
password = "melatonin overdose 1337!$"
1618
key = snap.set_password(password, 30)
1719
assert password == snap.get_password(key), "passwords do not match"
1820
assert snap.get_password(key) is None, "password should be expired"
1921

2022

21-
def test_password_is_not_stored_in_plaintext(memory_db):
23+
def test_password_is_not_stored_in_plaintext(memory_db: SqliteDatabase) -> None:
2224
_ = memory_db
2325
password = "trustno1"
2426
token = snap.set_password(password, 30)
@@ -27,7 +29,7 @@ def test_password_is_not_stored_in_plaintext(memory_db):
2729
assert stored_password_text not in password
2830

2931

30-
def test_returned_token_format(memory_db):
32+
def test_returned_token_format(memory_db: SqliteDatabase) -> None:
3133
_ = memory_db
3234
password = "trustsome1"
3335
token = snap.set_password(password, 30)
@@ -41,7 +43,7 @@ def test_returned_token_format(memory_db):
4143
assert False, "the encryption key is not valid"
4244

4345

44-
def test_encryption_key_is_returned(memory_db):
46+
def test_encryption_key_is_returned(memory_db: SqliteDatabase) -> None:
4547
_ = memory_db
4648
password = "trustany1"
4749
token = snap.set_password(password, 30)
@@ -53,14 +55,14 @@ def test_encryption_key_is_returned(memory_db):
5355
assert password == decrypted_password
5456

5557

56-
def test_password_is_decoded(memory_db):
58+
def test_password_is_decoded(memory_db: SqliteDatabase) -> None:
5759
_ = memory_db
5860
password = "correct horse battery staple"
5961
key = snap.set_password(password, 30)
6062
assert not isinstance(snap.get_password(key), bytes)
6163

6264

63-
def test_clean_input(memory_db):
65+
def test_clean_input(memory_db: SqliteDatabase) -> None:
6466
_ = memory_db
6567
# Test Bad Data
6668
with snap.app.test_request_context(
@@ -86,36 +88,36 @@ def test_clean_input(memory_db):
8688
assert (3600, "foo") == snap.clean_input()
8789

8890

89-
def test_password_before_expiration(memory_db):
91+
def test_password_before_expiration(memory_db: SqliteDatabase) -> None:
9092
_ = memory_db
9193
password = "fidelio"
9294
key = snap.set_password(password, 1)
9395
assert password == snap.get_password(key)
9496

9597

96-
def test_password_after_expiration(memory_db):
98+
def test_password_after_expiration(memory_db: SqliteDatabase) -> None:
9799
_ = memory_db
98100
password = "open sesame"
99101
key = snap.set_password(password, 1)
100102
time.sleep(2)
101103
assert snap.get_password(key) is None
102104

103105

104-
def test_preview_password(app):
106+
def test_preview_password(app: FlaskClient) -> None:
105107
password = "I like novelty kitten statues!"
106108
key = snap.set_password(password, 30)
107109
rv = app.get(f"/{key}")
108110
assert password not in rv.get_data(as_text=True)
109111

110112

111-
def test_show_password(app):
113+
def test_show_password(app: FlaskClient) -> None:
112114
password = "I like novelty kitten statues!"
113115
key = snap.set_password(password, 30)
114116
rv = app.post("/get-secret", data={"key": key})
115117
assert password in rv.get_data(as_text=True)
116118

117119

118-
def test_set_password_json(app):
120+
def test_set_password_json(app: FlaskClient) -> None:
119121
with freeze_time("2020-05-08 12:00:00") as frozen_time:
120122
password = "my name is my passport. verify me."
121123
rv = app.post(

0 commit comments

Comments
 (0)