mirror of
https://github.com/rjNemo/pass-gen
synced 2026-06-06 02:26:42 +00:00
chore: explicit types
This commit is contained in:
parent
80776e8be4
commit
97a21ae09e
5 changed files with 25 additions and 10 deletions
|
|
@ -10,7 +10,7 @@ A simple password generator command line interface.
|
||||||
- [x] Include numbers
|
- [x] Include numbers
|
||||||
- [x] As a user I want the generated password to be copied to the clipboard
|
- [x] As a user I want the generated password to be copied to the clipboard
|
||||||
- [x] As a user I want the generated password to be saved to a file
|
- [x] As a user I want the generated password to be saved to a file
|
||||||
- [ ] As a user I want to store generated passwords in a database for later usage
|
- [x] As a user I want to store generated passwords in a database for later usage
|
||||||
- [ ] Passwords must not be associated directly with the service they were generated for
|
- [ ] Passwords must not be associated directly with the service they were generated for
|
||||||
- [ ] I can verify if the password is associated to a given service
|
- [ ] I can verify if the password is associated to a given service
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
import sqlite3
|
import sqlite3
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
|
||||||
class DB:
|
class DB:
|
||||||
def __init__(self, db_str="pg.db") -> None:
|
def __init__(self, db_str: str = "pg.db") -> None:
|
||||||
self.connection = sqlite3.connect(db_str)
|
self.connection = sqlite3.connect(db_str)
|
||||||
self.cursor = self.connection.cursor()
|
self.cursor = self.connection.cursor()
|
||||||
self.execute("CREATE TABLE IF NOT EXISTS passwords (password text)")
|
self.execute("CREATE TABLE IF NOT EXISTS passwords (password text)")
|
||||||
|
|
@ -10,5 +11,5 @@ class DB:
|
||||||
def commit(self) -> None:
|
def commit(self) -> None:
|
||||||
self.connection.commit()
|
self.connection.commit()
|
||||||
|
|
||||||
def execute(self, query: str, *args) -> None:
|
def execute(self, query: str, *args: Any) -> None:
|
||||||
self.cursor.execute(query, *args)
|
self.cursor.execute(query, *args)
|
||||||
|
|
|
||||||
9
app/data/type.py
Normal file
9
app/data/type.py
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
from typing import Any, Protocol
|
||||||
|
|
||||||
|
|
||||||
|
class DBConnector(Protocol):
|
||||||
|
def commit(self) -> None:
|
||||||
|
...
|
||||||
|
|
||||||
|
def execute(self, query: str, *args: Any) -> None:
|
||||||
|
...
|
||||||
|
|
@ -3,10 +3,9 @@ from typing import Optional
|
||||||
|
|
||||||
import typer
|
import typer
|
||||||
|
|
||||||
import app.data.sqlite as sqlite
|
import app.repositories.sqlite as sqlite
|
||||||
import app.usecases.pass_gen as pass_gen
|
import app.usecases.pass_gen as pass_gen
|
||||||
import app.usecases.utils as utils
|
import app.usecases.utils as utils
|
||||||
from app.repositories.sqlite import PasswordRepository
|
|
||||||
|
|
||||||
app = typer.Typer()
|
app = typer.Typer()
|
||||||
|
|
||||||
|
|
@ -39,6 +38,7 @@ def main(
|
||||||
),
|
),
|
||||||
random: bool = True,
|
random: bool = True,
|
||||||
) -> None:
|
) -> None:
|
||||||
|
sqlite_repo = sqlite.get_instance()
|
||||||
seed = r.randint(0, 100) if random else 0
|
seed = r.randint(0, 100) if random else 0
|
||||||
options = pass_gen.PassGenOptions(
|
options = pass_gen.PassGenOptions(
|
||||||
seed=seed,
|
seed=seed,
|
||||||
|
|
@ -46,8 +46,7 @@ def main(
|
||||||
symbols=symbols,
|
symbols=symbols,
|
||||||
numbers=numbers,
|
numbers=numbers,
|
||||||
)
|
)
|
||||||
db = sqlite.DB()
|
|
||||||
sqlite_repo = PasswordRepository(db)
|
|
||||||
password = pass_gen.generate_password(sqlite_repo, options)
|
password = pass_gen.generate_password(sqlite_repo, options)
|
||||||
|
|
||||||
typer.echo(typer.style(f"🔐 {password}", fg=typer.colors.GREEN, bold=True))
|
typer.echo(typer.style(f"🔐 {password}", fg=typer.colors.GREEN, bold=True))
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,19 @@
|
||||||
from typing import Any
|
import app.data.sqlite as sqlite
|
||||||
|
from app.data.type import DBConnector
|
||||||
|
|
||||||
|
|
||||||
class PasswordRepository:
|
class PasswordRepository:
|
||||||
def __init__(self, db: Any) -> None:
|
def __init__(self, db: DBConnector) -> None:
|
||||||
self.db = db
|
self.db = db
|
||||||
|
|
||||||
def save(self, password: str) -> None:
|
def save(self, password: str) -> None:
|
||||||
try:
|
try:
|
||||||
self.db.execute(f"INSERT INTO passwords VALUES (:password)", {"password": password})
|
self.db.execute("INSERT INTO passwords VALUES (:password)", {"password": password})
|
||||||
self.db.commit()
|
self.db.commit()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(e)
|
print(e)
|
||||||
|
|
||||||
|
|
||||||
|
def get_instance() -> PasswordRepository:
|
||||||
|
db = sqlite.DB()
|
||||||
|
return PasswordRepository(db)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue