diff --git a/Pipfile.lock b/Pipfile.lock index 565544c..6b196bf 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "23e051ec53ebc361abbf021b0f9d11da381c0ac7632e2feb7885804bb5d88e46" + "sha256": "b1bba35cf3809622ba68e5c6d3e45856f177c2de92180eba2caf325ff287149c" }, "pipfile-spec": 6, "requires": { @@ -111,61 +111,39 @@ }, "coverage": { "hashes": [ - "sha256:00368e6328ebff76197fff5f4d5704b44098f89d8d99a67a349ad6674ec0b157", - "sha256:0389690e0a1c94e9a246dc3130355d70805e51ca509db1bf07fbde27efb33aa4", - "sha256:065d2181f44392893d37d0a4f9ff60b485d705f733356d0a2fb292a58c6f2e0f", - "sha256:082febdba717c769da92d5e19e14a659ebef6daab19b67fced304b7b8d2475e2", - "sha256:0a35ae0d590effb7cc96e7d6935ae2ab8a51526a111fbe0f12d1671aa9fdc377", - "sha256:142493f0400a0bd5acf03c52971229e937323c3e24c372800ae1c44a503e0921", - "sha256:186f53367a08e8d24cc534c7cbfa43a82d1618a48dec2e0c56e80577ec1888fe", - "sha256:2163a00bcd613e95e118c01ea2811f705fbbacf1904d657b24d306879e2303d3", - "sha256:24ecf342b1e23de259d81b3adc83578935babeb54f6950c9bd9534b12443a49c", - "sha256:2c24d3e09f433817ddd0cb2e8f82f8b42cd09a8ac558462fedf99be479ed4851", - "sha256:2d741575de4a13869c9d4a685235bacc897c94afd3703e2ad4fdc362f37e87da", - "sha256:305ca73c09dd84054a3a8f53d5b70e0325b5b303245d0b96ed505698dc7e8ea7", - "sha256:4bf1d0a390de707f8bfd49efdcdac9366ce77ed64cb35b344f58b1ec62517317", - "sha256:50d90d6b753debb7568621125aad4e5fb418e7bdcb0dba3fa6f4ee82994b35d4", - "sha256:5a2079bca21fa959608223b90cf2f95ce686a6497fb12bfaaa7bb24c3e298199", - "sha256:60c6d433f0357db7ed2a2a698fb75b8ce919ce547d6d6bc79c576e090f509768", - "sha256:66cfae29bccea703f02d8997f60d71e236c5a321588f5aa5a318bd88ca23dc0a", - "sha256:6d6fc990962559de1f3685eb3e365ca60f2e3257bfd145bf675c566b8ebb1944", - "sha256:703b126f3ad20c463b545e199c4da460695630da5fdfd949de6a6269b45eabab", - "sha256:730cee22c41852b90948343cdfd183db1e96a9de69fd4dabec3532c582afea68", - "sha256:7e4a16bde8a3b7424b2955130f5a6c29e741e7138fe05c5d9d72efc356076a80", - "sha256:801e8277958bc2e6cc1f2443a20a2a97f79583aa64524b130e1c0de44c287ca9", - "sha256:80baa69a78d5696c60b72dee44ac3d5ccf75ee82e84d018938ddf642d036a6a8", - "sha256:80c00ce9cef80afbf18d16cb3052f5601ba8d087501d829169eecb33c153346a", - "sha256:89db5a374d793344087732207ee15869549486b2148e3e2e6effe22146351fcd", - "sha256:917b98cc5725ea2e0b88c74d34182589a9be07092cb35b861ea9e74189174f71", - "sha256:9398f8fd89f6f260e94e57559df1885b8200b18312824b617a8789e0f5e7dc74", - "sha256:95b6f212bb0c7379f1f2f6e47c722fbdc7355d8b7488a68649e83dfa29522704", - "sha256:9f23313f3e494475581d46de3b8b6bdcf618ee1df412490e779a9aa0a6c72162", - "sha256:9f6f26e5b129bb0218aab30d368d6ead750517a457986f8854b1df4b4c318098", - "sha256:a502693c83a2c6558bc45b4c2dc01a00c9b99cb3cf846913438933a44af174fc", - "sha256:aa4999130a8e892fa9051edc18bf4daa0a2839d3f3de2dcfcbf0ae4619ee3b5e", - "sha256:b10be0b80784c1beb8061e5ce938d8511a182125de5fc695a60f0561b984d361", - "sha256:b1f7b23a606aaf2464eb81c23b5b20623e2ba44b4aaca6ea9bfe00e84a1a5264", - "sha256:b78c8d232d97dbc8ad3a3d94cc15fccabe9a331685d76d2e5cb5284acc4a5feb", - "sha256:b88fa862817035ad7921f2641c27a85dab12cc685ad3ef29c0caaf5b3d10a868", - "sha256:b93fb9137070899b5f10d6487724f4427b5945983a785e1e2f1102c5e175c516", - "sha256:b9639e16c1bc4eb8a78b3b30df4146bb78df5d52ba1b7454b634abd89aede6cc", - "sha256:baa3b6be365c97f80d92a397cb8963dcd9bc22d101b39784e77a9cad093812f8", - "sha256:c06c5758bae454a49dc3e7917804b46c31bb4a72cedfc8e7b4f17a318b3de9d6", - "sha256:c544153709e93ea7e9edcefee72f5afcf484a9cb526067065f9419419f4a3694", - "sha256:c6c74260ba130f7c20a340e8f9e544b0941621641f53edcf69e4602e12c9f29e", - "sha256:d040615ff5c02ffd97ba9f0f73b9db34c09b8142fbfdd363b2a79fa6a554242c", - "sha256:d85774b1ac09ec1d958e63baa436cc4c90e2e910294847ba51dcc3ca3ca04a63", - "sha256:e508bb216eee8350e77b436f9f99c4f2d8335ecb51483f5ffd8bf5e84aaa56d1", - "sha256:ea1cb38b1a52392ebb4e93eaf4a44b3cfdec35cca3f78a9a599f27b7f27031e2", - "sha256:ec310e0029d530d1043f638b7a326b349884421572626bc2909408da7b0d03e5", - "sha256:ed04b79f53fa975660f1a598120c504a0f4529170eeaf0d823fcc1f06f4d2e0f", - "sha256:f4909ee1ddabed351f0fa55063a7dbe498001e2245a9602d9fb0fd74afecdca9", - "sha256:f49ae9e19737493911e7f8e551310f719f463e442ea1ec92fe0804c62066a7e8", - "sha256:f4c93e6102087dda4931fcd50fa4ad44e8e43e09419290c5f05cc2c690961ebf", - "sha256:fa1b639d85af4794cb20d7cfd4c5ae38e94a418b17a2318a1992b470fb68260d" + "sha256:16db4173575901db8f3e6cc05e50fe19c7849b0256f6dc2e0979485184053417", + "sha256:18183948d5480e2ae30ad67edddf748149c778592b7e4ee649c058d5de2dcbb1", + "sha256:22888d3ce1b6fa1125f0be1602d8c634e00e7ec3a87bdb594ad87bde0b00b2b6", + "sha256:23c1611471cbfa2ac0e283862a76a333c13e5e7c4d499feb9919a5f52884610e", + "sha256:2dcc6d62b69a82759e5dddd788e09dd329124e493e62d92cfd01c0b918d7e511", + "sha256:40e30139113b141c238620b700aa5bd5c1b3a7b29ae47398936ff1c9166109d9", + "sha256:4528368196a90f11b70fb5668c13d92e88ba795eb4d37aab5855fd0479db417b", + "sha256:4cbdc51fc8c00ec6e53b30221d5757034aecf9839761bf97eaec0db7f0ff4955", + "sha256:6a585ba4087cc1fb5bfe34d1ecaaee183b854427992be2b42f1722ba8289fa82", + "sha256:79c136327e90ee46a2b3094263df94da5212890d6145678741eb805d79714971", + "sha256:7beec4df7542cf681356ef243fee3bf948775fc0d125bdcad3508e834229e07d", + "sha256:8394626a07e0a1b3695a16a4548d32e7259e00817d4bab1ef8172a1bd82a724e", + "sha256:84a1000f622d1df8824cd1ac629aa8392679c5c4de3f0de9e6889373f99ff3a0", + "sha256:91cd79f0f2996a4de737de89fdcbcd379a5bfd7b15129378ad1e5fc234e58d33", + "sha256:951e8d7bc98bceb61fc4fb426966fae854160301c0f8cd0945c62f2504f68615", + "sha256:95d2293d6a60da8952c675050231c02c9f4f1c1b9cf916315173e921d137d683", + "sha256:9981294b131023e63061ba88f4498fe27b9b15d908079d1866ee66a63d6e793f", + "sha256:a8826f6ecf079cb648534790ba59218a64e12a59bf2cd9ff00199abb39864a79", + "sha256:c1630e847ae0a2a366f18ddc3e017b69f80d729e95830579c61b5f9e9b94b91e", + "sha256:c6f46d5bbec8fe1ff25215356e819528a90d84b2801703514746b665742f1cd2", + "sha256:c8099c7033fb1ca73ac2246c3e52f45dd6a9c3826c59b3b5ad94e5be4e08d99b", + "sha256:ceb872b89c6461d4365be5f8fbf14f867be6b5217760980de7e014e54648f8ef", + "sha256:d6fbe69d52628b3e8a144265fd134f5da07cf287a00cf529730ae10380d315b2", + "sha256:da7de6e4162c69cc03cc56b7d051ae11147ac30872ff57df4ba4cac6d70ce5d9", + "sha256:ddb2287f66500ac57b24cce60341074b148977b74cd20eca755f95262928086f", + "sha256:e6a4260f0abf90c023b4f838905f645695b31666b76837152e2befad3d1ef5d6", + "sha256:e97b387f2744762b9984639b59abd7abb46ea6ae2ea24cb7c07893612328559b", + "sha256:ea784c96ca3b94912176d7adc9c4bb7d1988f36a0223a9ac128f4c834775202c", + "sha256:f0b250a03891255feb3ae69ac29d05cf9a62f5869bb8bac0e7f4968e7274efac", + "sha256:fdaa96733c9cf85491ad406fd78aa16025a1ea468951545b3da7ee133c150c7a" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==5.6b1" + "markers": "python_version >= '3.6'", + "version": "==6.0b1" }, "flake8": { "hashes": [ @@ -251,10 +229,10 @@ }, "pathspec": { "hashes": [ - "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd", - "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d" + "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a", + "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1" ], - "version": "==0.8.1" + "version": "==0.9.0" }, "pbr": { "hashes": [ diff --git a/app/main.py b/app/main.py index b8dcb1a..bcdf220 100644 --- a/app/main.py +++ b/app/main.py @@ -1,10 +1,10 @@ import random as r -import subprocess from typing import Optional import typer -from .pass_gen import PassGenOptions, generate_password +import app.usecases.pass_gen as pass_gen +import app.usecases.utils as utils app = typer.Typer() @@ -38,29 +38,20 @@ def main( random: bool = True, ) -> None: seed = r.randint(0, 100) if random else 0 - options = PassGenOptions( + options = pass_gen.PassGenOptions( seed=seed, length=length, symbols=symbols, numbers=numbers, ) - password = generate_password(options) + password = pass_gen.generate_password(options) typer.echo(typer.style(f"🔐 {password}", fg=typer.colors.GREEN, bold=True)) if file is not None: - save_to_file(file, password) + utils.save_to_file(file, password) return typer.echo(f"The password has been saved to: {file} 🗄") - return copy_to_clipboard(password) - - -def copy_to_clipboard(password: str) -> None: - subprocess.run("pbcopy", universal_newlines=True, input=password) + utils.copy_to_clipboard(password) return typer.echo("The password has been copied to your clipboard 😉\nPaste it using cmd + v") - - -def save_to_file(file: str, password: str) -> None: - with open(file, "w") as f: - f.write(password) diff --git a/app/usecases/__init__.py b/app/usecases/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/pass_gen.py b/app/usecases/pass_gen.py similarity index 80% rename from app/pass_gen.py rename to app/usecases/pass_gen.py index 9948593..2d4c4cb 100644 --- a/app/pass_gen.py +++ b/app/usecases/pass_gen.py @@ -14,9 +14,7 @@ class PassGenOptions(BaseModel): def generate_password(options: PassGenOptions) -> str: characters = _build_characters(symbols=options.symbols, numbers=options.numbers) - random_generator = _new_random_generator(options.seed) - return "".join(random_generator.sample(characters, options.length)) @@ -30,11 +28,10 @@ def _new_random_generator(seed: int) -> RandomSampler: def _build_characters(symbols: bool, numbers: bool) -> str: - characters = string.ascii_letters - - if symbols: - characters += string.punctuation - if numbers: - characters += string.digits - - return characters + return "".join( + [ + string.ascii_letters, + string.punctuation if symbols else "", + string.digits if numbers else "", + ] + ) diff --git a/app/usecases/utils.py b/app/usecases/utils.py new file mode 100644 index 0000000..9db9f1a --- /dev/null +++ b/app/usecases/utils.py @@ -0,0 +1,10 @@ +import subprocess + + +def copy_to_clipboard(password: str) -> None: + subprocess.run("pbcopy", universal_newlines=True, input=password) + + +def save_to_file(file: str, password: str) -> None: + with open(file, "w") as f: + f.write(password) diff --git a/tests/pass_gen_test.py b/tests/pass_gen_test.py index b5e9a98..b2358b8 100644 --- a/tests/pass_gen_test.py +++ b/tests/pass_gen_test.py @@ -1,5 +1,5 @@ import pytest -from app.pass_gen import PassGenOptions, generate_password +from app.usecases.pass_gen import PassGenOptions, generate_password @pytest.mark.parametrize(