mirror of
https://github.com/rjNemo/pass-gen
synced 2026-06-06 02:26:42 +00:00
feat: add short commands and refactor
This commit is contained in:
parent
a8308f0b04
commit
5a54f14d1f
9 changed files with 177 additions and 94 deletions
10
.vscode/settings.json
vendored
10
.vscode/settings.json
vendored
|
|
@ -4,5 +4,13 @@
|
|||
],
|
||||
"python.testing.unittestEnabled": false,
|
||||
"python.testing.nosetestsEnabled": false,
|
||||
"python.testing.pytestEnabled": true
|
||||
"python.testing.pytestEnabled": true,
|
||||
"spellright.language": [
|
||||
"en"
|
||||
],
|
||||
"spellright.documentTypes": [
|
||||
"markdown",
|
||||
"latex",
|
||||
"plaintext"
|
||||
]
|
||||
}
|
||||
1
Pipfile
1
Pipfile
|
|
@ -4,6 +4,7 @@ verify_ssl = true
|
|||
name = "pypi"
|
||||
|
||||
[packages]
|
||||
pydantic = "==1.8.2"
|
||||
typer = "==0.3.2"
|
||||
|
||||
[dev-packages]
|
||||
|
|
|
|||
160
Pipfile.lock
generated
160
Pipfile.lock
generated
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"_meta": {
|
||||
"hash": {
|
||||
"sha256": "ca7961fcac4b43a2fb90aeddc0c5c638e2043b5ebbacb8670e93cc0897a855b0"
|
||||
"sha256": "23e051ec53ebc361abbf021b0f9d11da381c0ac7632e2feb7885804bb5d88e46"
|
||||
},
|
||||
"pipfile-spec": 6,
|
||||
"requires": {
|
||||
|
|
@ -24,6 +24,34 @@
|
|||
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
|
||||
"version": "==7.1.2"
|
||||
},
|
||||
"pydantic": {
|
||||
"hashes": [
|
||||
"sha256:021ea0e4133e8c824775a0cfe098677acf6fa5a3cbf9206a376eed3fc09302cd",
|
||||
"sha256:05ddfd37c1720c392f4e0d43c484217b7521558302e7069ce8d318438d297739",
|
||||
"sha256:05ef5246a7ffd2ce12a619cbb29f3307b7c4509307b1b49f456657b43529dc6f",
|
||||
"sha256:10e5622224245941efc193ad1d159887872776df7a8fd592ed746aa25d071840",
|
||||
"sha256:18b5ea242dd3e62dbf89b2b0ec9ba6c7b5abaf6af85b95a97b00279f65845a23",
|
||||
"sha256:234a6c19f1c14e25e362cb05c68afb7f183eb931dd3cd4605eafff055ebbf287",
|
||||
"sha256:244ad78eeb388a43b0c927e74d3af78008e944074b7d0f4f696ddd5b2af43c62",
|
||||
"sha256:26464e57ccaafe72b7ad156fdaa4e9b9ef051f69e175dbbb463283000c05ab7b",
|
||||
"sha256:41b542c0b3c42dc17da70554bc6f38cbc30d7066d2c2815a94499b5684582ecb",
|
||||
"sha256:4a03cbbe743e9c7247ceae6f0d8898f7a64bb65800a45cbdc52d65e370570820",
|
||||
"sha256:4be75bebf676a5f0f87937c6ddb061fa39cbea067240d98e298508c1bda6f3f3",
|
||||
"sha256:54cd5121383f4a461ff7644c7ca20c0419d58052db70d8791eacbbe31528916b",
|
||||
"sha256:589eb6cd6361e8ac341db97602eb7f354551482368a37f4fd086c0733548308e",
|
||||
"sha256:8621559dcf5afacf0069ed194278f35c255dc1a1385c28b32dd6c110fd6531b3",
|
||||
"sha256:8b223557f9510cf0bfd8b01316bf6dd281cf41826607eada99662f5e4963f316",
|
||||
"sha256:99a9fc39470010c45c161a1dc584997f1feb13f689ecf645f59bb4ba623e586b",
|
||||
"sha256:a7c6002203fe2c5a1b5cbb141bb85060cbff88c2d78eccbc72d97eb7022c43e4",
|
||||
"sha256:a83db7205f60c6a86f2c44a61791d993dff4b73135df1973ecd9eed5ea0bda20",
|
||||
"sha256:ac8eed4ca3bd3aadc58a13c2aa93cd8a884bcf21cb019f8cfecaae3b6ce3746e",
|
||||
"sha256:e710876437bc07bd414ff453ac8ec63d219e7690128d925c6e82889d674bb505",
|
||||
"sha256:ea5cb40a3b23b3265f6325727ddfc45141b08ed665458be8c6285e7b85bd73a1",
|
||||
"sha256:fec866a0b59f372b7e776f2d7308511784dace622e0992a0b59ea3ccee0ae833"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==1.8.2"
|
||||
},
|
||||
"typer": {
|
||||
"hashes": [
|
||||
"sha256:5455d750122cff96745b0dec87368f56d023725a7ebc9d2e54dd23dc86816303",
|
||||
|
|
@ -31,6 +59,14 @@
|
|||
],
|
||||
"index": "pypi",
|
||||
"version": "==0.3.2"
|
||||
},
|
||||
"typing-extensions": {
|
||||
"hashes": [
|
||||
"sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497",
|
||||
"sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342",
|
||||
"sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"
|
||||
],
|
||||
"version": "==3.10.0.0"
|
||||
}
|
||||
},
|
||||
"develop": {
|
||||
|
|
@ -75,61 +111,61 @@
|
|||
},
|
||||
"coverage": {
|
||||
"hashes": [
|
||||
"sha256:004d1880bed2d97151facef49f08e255a20ceb6f9432df75f4eef018fdd5a78c",
|
||||
"sha256:01d84219b5cdbfc8122223b39a954820929497a1cb1422824bb86b07b74594b6",
|
||||
"sha256:040af6c32813fa3eae5305d53f18875bedd079960822ef8ec067a66dd8afcd45",
|
||||
"sha256:06191eb60f8d8a5bc046f3799f8a07a2d7aefb9504b0209aff0b47298333302a",
|
||||
"sha256:13034c4409db851670bc9acd836243aeee299949bd5673e11844befcb0149f03",
|
||||
"sha256:13c4ee887eca0f4c5a247b75398d4114c37882658300e153113dafb1d76de529",
|
||||
"sha256:184a47bbe0aa6400ed2d41d8e9ed868b8205046518c52464fde713ea06e3a74a",
|
||||
"sha256:18ba8bbede96a2c3dde7b868de9dcbd55670690af0988713f0603f037848418a",
|
||||
"sha256:1aa846f56c3d49205c952d8318e76ccc2ae23303351d9270ab220004c580cfe2",
|
||||
"sha256:217658ec7187497e3f3ebd901afdca1af062b42cfe3e0dafea4cced3983739f6",
|
||||
"sha256:24d4a7de75446be83244eabbff746d66b9240ae020ced65d060815fac3423759",
|
||||
"sha256:2910f4d36a6a9b4214bb7038d537f015346f413a975d57ca6b43bf23d6563b53",
|
||||
"sha256:2949cad1c5208b8298d5686d5a85b66aae46d73eec2c3e08c817dd3513e5848a",
|
||||
"sha256:2a3859cb82dcbda1cfd3e6f71c27081d18aa251d20a17d87d26d4cd216fb0af4",
|
||||
"sha256:2cafbbb3af0733db200c9b5f798d18953b1a304d3f86a938367de1567f4b5bff",
|
||||
"sha256:2e0d881ad471768bf6e6c2bf905d183543f10098e3b3640fc029509530091502",
|
||||
"sha256:30c77c1dc9f253283e34c27935fded5015f7d1abe83bc7821680ac444eaf7793",
|
||||
"sha256:3487286bc29a5aa4b93a072e9592f22254291ce96a9fbc5251f566b6b7343cdb",
|
||||
"sha256:372da284cfd642d8e08ef606917846fa2ee350f64994bebfbd3afb0040436905",
|
||||
"sha256:41179b8a845742d1eb60449bdb2992196e211341818565abded11cfa90efb821",
|
||||
"sha256:44d654437b8ddd9eee7d1eaee28b7219bec228520ff809af170488fd2fed3e2b",
|
||||
"sha256:4a7697d8cb0f27399b0e393c0b90f0f1e40c82023ea4d45d22bce7032a5d7b81",
|
||||
"sha256:51cb9476a3987c8967ebab3f0fe144819781fca264f57f89760037a2ea191cb0",
|
||||
"sha256:52596d3d0e8bdf3af43db3e9ba8dcdaac724ba7b5ca3f6358529d56f7a166f8b",
|
||||
"sha256:53194af30d5bad77fcba80e23a1441c71abfb3e01192034f8246e0d8f99528f3",
|
||||
"sha256:5fec2d43a2cc6965edc0bb9e83e1e4b557f76f843a77a2496cbe719583ce8184",
|
||||
"sha256:6c90e11318f0d3c436a42409f2749ee1a115cd8b067d7f14c148f1ce5574d701",
|
||||
"sha256:74d881fc777ebb11c63736622b60cb9e4aee5cace591ce274fb69e582a12a61a",
|
||||
"sha256:7501140f755b725495941b43347ba8a2777407fc7f250d4f5a7d2a1050ba8e82",
|
||||
"sha256:796c9c3c79747146ebd278dbe1e5c5c05dd6b10cc3bcb8389dfdf844f3ead638",
|
||||
"sha256:869a64f53488f40fa5b5b9dcb9e9b2962a66a87dab37790f3fcfb5144b996ef5",
|
||||
"sha256:8963a499849a1fc54b35b1c9f162f4108017b2e6db2c46c1bed93a72262ed083",
|
||||
"sha256:8d0a0725ad7c1a0bcd8d1b437e191107d457e2ec1084b9f190630a4fb1af78e6",
|
||||
"sha256:900fbf7759501bc7807fd6638c947d7a831fc9fdf742dc10f02956ff7220fa90",
|
||||
"sha256:92b017ce34b68a7d67bd6d117e6d443a9bf63a2ecf8567bb3d8c6c7bc5014465",
|
||||
"sha256:970284a88b99673ccb2e4e334cfb38a10aab7cd44f7457564d11898a74b62d0a",
|
||||
"sha256:972c85d205b51e30e59525694670de6a8a89691186012535f9d7dbaa230e42c3",
|
||||
"sha256:9a1ef3b66e38ef8618ce5fdc7bea3d9f45f3624e2a66295eea5e57966c85909e",
|
||||
"sha256:af0e781009aaf59e25c5a678122391cb0f345ac0ec272c7961dc5455e1c40066",
|
||||
"sha256:b6d534e4b2ab35c9f93f46229363e17f63c53ad01330df9f2d6bd1187e5eaacf",
|
||||
"sha256:b7895207b4c843c76a25ab8c1e866261bcfe27bfaa20c192de5190121770672b",
|
||||
"sha256:c0891a6a97b09c1f3e073a890514d5012eb256845c451bd48f7968ef939bf4ae",
|
||||
"sha256:c2723d347ab06e7ddad1a58b2a821218239249a9e4365eaff6649d31180c1669",
|
||||
"sha256:d1f8bf7b90ba55699b3a5e44930e93ff0189aa27186e96071fac7dd0d06a1873",
|
||||
"sha256:d1f9ce122f83b2305592c11d64f181b87153fc2c2bbd3bb4a3dde8303cfb1a6b",
|
||||
"sha256:d314ed732c25d29775e84a960c3c60808b682c08d86602ec2c3008e1202e3bb6",
|
||||
"sha256:d636598c8305e1f90b439dbf4f66437de4a5e3c31fdf47ad29542478c8508bbb",
|
||||
"sha256:deee1077aae10d8fa88cb02c845cfba9b62c55e1183f52f6ae6a2df6a2187160",
|
||||
"sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c",
|
||||
"sha256:f030f8873312a16414c0d8e1a1ddff2d3235655a2174e3648b4fa66b3f2f1079",
|
||||
"sha256:f0b278ce10936db1a37e6954e15a3730bea96a0997c26d7fee88e6c396c2086d",
|
||||
"sha256:f11642dddbb0253cc8853254301b51390ba0081750a8ac03f20ea8103f0c56b6"
|
||||
"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"
|
||||
],
|
||||
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'",
|
||||
"version": "==5.5"
|
||||
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
|
||||
"version": "==5.6b1"
|
||||
},
|
||||
"flake8": {
|
||||
"hashes": [
|
||||
|
|
@ -230,11 +266,11 @@
|
|||
},
|
||||
"pluggy": {
|
||||
"hashes": [
|
||||
"sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0",
|
||||
"sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"
|
||||
"sha256:265a94bf44ca13662f12fcd1b074c14d4b269a712f051b6f644ef7e705d6735f",
|
||||
"sha256:467f0219e89bb5061a8429c6fc5cf055fa3983a0e68e84a1d205046306b37d9e"
|
||||
],
|
||||
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
|
||||
"version": "==0.13.1"
|
||||
"version": "==1.0.0.dev0"
|
||||
},
|
||||
"py": {
|
||||
"hashes": [
|
||||
|
|
@ -262,11 +298,11 @@
|
|||
},
|
||||
"pyparsing": {
|
||||
"hashes": [
|
||||
"sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1",
|
||||
"sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"
|
||||
"sha256:1c6409312ce2ce2997896af5756753778d5f1603666dba5587804f09ad82ed27",
|
||||
"sha256:f4896b4cc085a1f8f8ae53a1a90db5a86b3825ff73eb974dffee3d9e701007f4"
|
||||
],
|
||||
"markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'",
|
||||
"version": "==2.4.7"
|
||||
"markers": "python_version >= '3.5'",
|
||||
"version": "==3.0.0b2"
|
||||
},
|
||||
"pytest": {
|
||||
"hashes": [
|
||||
|
|
|
|||
13
README.md
13
README.md
|
|
@ -5,18 +5,19 @@ A simple password generator command line interface.
|
|||
## Stories
|
||||
|
||||
- [x] As a user I want to generate a random secure password to protect my personal accounts
|
||||
- [x] Minimal length
|
||||
- [x] Include symbols
|
||||
- [x] Include numbers
|
||||
- [x] Minimal length
|
||||
- [x] Include symbols
|
||||
- [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 saved to a file
|
||||
|
||||
- [ ] 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
|
||||
- [ ] I can verify if the password is associated to a given service
|
||||
|
||||
## Getting Started
|
||||
|
||||
These instructions will get you a copy of the project up and running on your local machine for development and testing purposes. See deployment for notes on how to deploy the project on a live system.
|
||||
|
||||
|
||||
### Installing
|
||||
|
||||
Clone the project repository
|
||||
|
|
@ -49,7 +50,6 @@ make help
|
|||
make test
|
||||
```
|
||||
|
||||
|
||||
## Built With
|
||||
|
||||
- [Typer](https://typer.tiangolo.com/) - Typer, build great CLIs. Easy to code. Based on Python type hints
|
||||
|
|
@ -71,4 +71,3 @@ See also the list of [contributors](https://github.com/rjNemo/pass-gen/contribut
|
|||
## License
|
||||
|
||||
This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details
|
||||
|
||||
|
|
|
|||
51
app/main.py
51
app/main.py
|
|
@ -4,34 +4,63 @@ from typing import Optional
|
|||
|
||||
import typer
|
||||
|
||||
from .pass_gen import generate_password
|
||||
from .pass_gen import PassGenOptions, generate_password
|
||||
|
||||
app = typer.Typer()
|
||||
|
||||
|
||||
@app.command()
|
||||
def main(
|
||||
random: bool = True,
|
||||
length: int = typer.Option(8, help="Length of the generated password."),
|
||||
length: int = typer.Option(
|
||||
8,
|
||||
"--length",
|
||||
"-l",
|
||||
help="Length of the generated password.",
|
||||
),
|
||||
numbers: bool = typer.Option(
|
||||
True, help="If the generated password should include numeric characters."
|
||||
True,
|
||||
"--numbers",
|
||||
"-n",
|
||||
help="If the generated password should include numeric characters.",
|
||||
),
|
||||
symbols: bool = typer.Option(
|
||||
False, help="If the generated password should include special characters."
|
||||
False,
|
||||
"--symbols",
|
||||
"-s",
|
||||
help="If the generated password should include special characters.",
|
||||
),
|
||||
file: Optional[str] = typer.Option(
|
||||
None, help="Path to the file where the generated password should be saved."
|
||||
None,
|
||||
"--file",
|
||||
"-f",
|
||||
help="Path to the file where the generated password should be saved.",
|
||||
),
|
||||
random: bool = True,
|
||||
) -> None:
|
||||
seed = r.randint(0, 100) if random else 0
|
||||
password = generate_password(seed, length, symbols, numbers)
|
||||
options = PassGenOptions(
|
||||
seed=seed,
|
||||
length=length,
|
||||
symbols=symbols,
|
||||
numbers=numbers,
|
||||
)
|
||||
|
||||
password = generate_password(options)
|
||||
|
||||
typer.echo(typer.style(f"🔐 {password}", fg=typer.colors.GREEN, bold=True))
|
||||
|
||||
if file is not None:
|
||||
with open(file, "w") as f:
|
||||
f.write(password)
|
||||
return
|
||||
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)
|
||||
typer.echo("The password has been copied to your clipboard 😉\nPaste it using cmd + v")
|
||||
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)
|
||||
|
|
|
|||
|
|
@ -2,15 +2,22 @@ import random
|
|||
import string
|
||||
from typing import Protocol
|
||||
|
||||
from pydantic import BaseModel
|
||||
|
||||
def generate_password(
|
||||
seed: int, length: int = 8, symbols: bool = False, numbers: bool = True
|
||||
) -> str:
|
||||
characters = _build_characters(symbols=symbols, numbers=numbers)
|
||||
|
||||
random_generator = _new_random_generator(seed)
|
||||
class PassGenOptions(BaseModel):
|
||||
seed: int
|
||||
length: int = 8
|
||||
symbols: bool = False
|
||||
numbers: bool = True
|
||||
|
||||
return "".join(random_generator.sample(characters, length))
|
||||
|
||||
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))
|
||||
|
||||
|
||||
class RandomSampler(Protocol):
|
||||
|
|
|
|||
|
|
@ -1 +0,0 @@
|
|||
-'R>;X*cut&2^aOK
|
||||
|
|
@ -26,7 +26,7 @@ def test_cli_can_set_symbols() -> None:
|
|||
|
||||
|
||||
def test_cli_can_set_numbers() -> None:
|
||||
args = ["--no-numbers"]
|
||||
args = ["-n"]
|
||||
result = _run_cli(*args)
|
||||
print(result.stdout)
|
||||
assert "yWAcqGFz" in result.stdout
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import pytest
|
||||
from app.pass_gen import generate_password
|
||||
from app.pass_gen import PassGenOptions, generate_password
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
|
|
@ -10,7 +10,8 @@ from app.pass_gen import generate_password
|
|||
],
|
||||
)
|
||||
def test_can_generate_random_password(seed: int, expected: str) -> None:
|
||||
assert generate_password(seed) == expected
|
||||
options = PassGenOptions(seed=seed)
|
||||
assert generate_password(options) == expected
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
|
|
@ -21,7 +22,8 @@ def test_can_generate_random_password(seed: int, expected: str) -> None:
|
|||
],
|
||||
)
|
||||
def test_control_password_length(seed: int, length: int, expected: str) -> None:
|
||||
assert generate_password(seed, length) == expected
|
||||
options = PassGenOptions(seed=seed, length=length)
|
||||
assert generate_password(options) == expected
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
|
|
@ -32,7 +34,8 @@ def test_control_password_length(seed: int, length: int, expected: str) -> None:
|
|||
],
|
||||
)
|
||||
def test_password_can_contain_symbols(seed: int, symbols: bool, expected: str) -> None:
|
||||
assert generate_password(seed, symbols=symbols) == expected
|
||||
options = PassGenOptions(seed=seed, symbols=symbols)
|
||||
assert generate_password(options) == expected
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
|
|
@ -43,4 +46,5 @@ def test_password_can_contain_symbols(seed: int, symbols: bool, expected: str) -
|
|||
],
|
||||
)
|
||||
def test_password_can_contain_numbers(seed: int, numbers: bool, expected: str) -> None:
|
||||
assert generate_password(seed, numbers=numbers) == expected
|
||||
options = PassGenOptions(seed=seed, numbers=numbers)
|
||||
assert generate_password(options) == expected
|
||||
|
|
|
|||
Loading…
Reference in a new issue