Skip to content

Commit 5ede414

Browse files
committed
fixes
1 parent b0172cb commit 5ede414

File tree

6 files changed

+137
-41
lines changed

6 files changed

+137
-41
lines changed
Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,34 +18,40 @@ def get_args():
1818
parser.add_argument('file',
1919
metavar='FILE',
2020
type=argparse.FileType('r'),
21-
nargs='*',
22-
help='Input file(s)',
23-
default=[open('/usr/share/dict/words')])
21+
nargs='+',
22+
help='Input file(s)')
2423

2524
parser.add_argument('-n',
2625
'--num',
27-
metavar='int',
26+
metavar='num_passwords',
2827
type=int,
2928
default=3,
3029
help='Number of passwords to generate')
3130

3231
parser.add_argument('-w',
3332
'--num_words',
34-
metavar='int',
33+
metavar='num_words',
3534
type=int,
3635
default=4,
3736
help='Number of words to use for password')
3837

3938
parser.add_argument('-m',
4039
'--min_word_len',
41-
metavar='int',
40+
metavar='mininum',
4241
type=int,
43-
default=4,
42+
default=3,
4443
help='Minimum word length')
4544

45+
parser.add_argument('-x',
46+
'--max_word_len',
47+
metavar='maximumm',
48+
type=int,
49+
default=6,
50+
help='Maximum word length')
51+
4652
parser.add_argument('-s',
4753
'--seed',
48-
metavar='int',
54+
metavar='seed',
4955
type=int,
5056
help='Random seed')
5157

@@ -59,24 +65,27 @@ def get_args():
5965

6066
# --------------------------------------------------
6167
def main():
62-
"""Make a jazz noise here"""
63-
6468
args = get_args()
65-
random.seed(args.seed)
69+
random.seed(args.seed) # <1>
6670
words = set()
6771

72+
def word_len(word):
73+
return args.min_word_len <= len(word) <= args.max_word_len
74+
6875
for fh in args.file:
6976
for line in fh:
70-
for word in filter(lambda w: len(w) >= args.min_word_len,
71-
map(clean,
72-
line.lower().split())):
77+
for word in filter(word_len, map(clean, line.lower().split())):
7378
words.add(word.title())
7479

7580
words = sorted(words)
7681
passwords = [
7782
''.join(random.sample(words, args.num_words)) for _ in range(args.num)
7883
]
79-
print('\n'.join(map(l33t, passwords) if args.l33t else passwords))
84+
85+
if args.l33t:
86+
passwords = map(l33t, passwords)
87+
88+
print('\n'.join(passwords))
8089

8190

8291
# --------------------------------------------------
Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,34 +18,40 @@ def get_args():
1818
parser.add_argument('file',
1919
metavar='FILE',
2020
type=argparse.FileType('r'),
21-
nargs='*',
22-
help='Input file(s)',
23-
default=[open('/usr/share/dict/words')])
21+
nargs='+',
22+
help='Input file(s)')
2423

2524
parser.add_argument('-n',
2625
'--num',
27-
metavar='int',
26+
metavar='num_passwords',
2827
type=int,
2928
default=3,
3029
help='Number of passwords to generate')
3130

3231
parser.add_argument('-w',
3332
'--num_words',
34-
metavar='int',
33+
metavar='num_words',
3534
type=int,
3635
default=4,
3736
help='Number of words to use for password')
3837

3938
parser.add_argument('-m',
4039
'--min_word_len',
41-
metavar='int',
40+
metavar='mininum',
4241
type=int,
43-
default=4,
42+
default=3,
4443
help='Minimum word length')
4544

45+
parser.add_argument('-x',
46+
'--max_word_len',
47+
metavar='maximumm',
48+
type=int,
49+
default=6,
50+
help='Maximum word length')
51+
4652
parser.add_argument('-s',
4753
'--seed',
48-
metavar='int',
54+
metavar='seed',
4955
type=int,
5056
help='Random seed')
5157

@@ -59,26 +65,27 @@ def get_args():
5965

6066
# --------------------------------------------------
6167
def main():
62-
"""Make a jazz noise here"""
63-
6468
args = get_args()
65-
random.seed(args.seed)
69+
random.seed(args.seed) # <1>
6670
words = set()
6771

72+
def word_len(word):
73+
return args.min_word_len <= len(word) <= args.max_word_len
74+
6875
for fh in args.file:
6976
for line in fh:
70-
for word in filter(lambda w: len(w) >= args.min_word_len,
71-
map(clean,
72-
line.lower().split())):
77+
for word in filter(word_len, map(clean, line.lower().split())):
7378
words.add(word.title())
7479

7580
words = sorted(words)
76-
passwords = []
77-
for _ in range(args.num):
78-
passwords.append(''.join(random.sample(words, args.num_words)))
81+
passwords = [
82+
''.join(random.sample(words, args.num_words)) for _ in range(args.num)
83+
]
84+
85+
if args.l33t:
86+
passwords = map(l33t, passwords)
7987

80-
for password in passwords:
81-
print(l33t(password) if args.l33t else password)
88+
print('\n'.join(passwords))
8289

8390

8491
# --------------------------------------------------

20_password/test.py

Lines changed: 82 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@
88
from subprocess import getstatusoutput
99

1010
prg = './password.py'
11+
words = '../inputs/words.txt'
1112

1213

1314
# --------------------------------------------------
1415
def test_exists():
1516
"""exists"""
1617

1718
assert os.path.isfile(prg)
19+
assert os.path.isfile(words)
1820

1921

2022
# --------------------------------------------------
@@ -43,7 +45,7 @@ def test_bad_num():
4345

4446
bad = random_string()
4547
flag = '-n' if random.choice([0, 1]) else '--num'
46-
rv, out = getstatusoutput(f'{prg} {flag} {bad}')
48+
rv, out = getstatusoutput(f'{prg} {flag} {bad} {words}')
4749
assert rv != 0
4850
assert re.search(f"invalid int value: '{bad}'", out)
4951

@@ -54,7 +56,7 @@ def test_bad_num_words():
5456

5557
bad = random_string()
5658
flag = '-w' if random.choice([0, 1]) else '--num_words'
57-
rv, out = getstatusoutput(f'{prg} {flag} {bad}')
59+
rv, out = getstatusoutput(f'{prg} {flag} {bad} {words}')
5860
assert rv != 0
5961
assert re.search(f"invalid int value: '{bad}'", out)
6062

@@ -65,7 +67,18 @@ def test_bad_min_word_len():
6567

6668
bad = random_string()
6769
flag = '-m' if random.choice([0, 1]) else '--min_word_len'
68-
rv, out = getstatusoutput(f'{prg} {flag} {bad}')
70+
rv, out = getstatusoutput(f'{prg} {flag} {bad} {words}')
71+
assert rv != 0
72+
assert re.search(f"invalid int value: '{bad}'", out)
73+
74+
75+
# --------------------------------------------------
76+
def test_bad_max_word_len():
77+
"""Dies on bad max_word_len"""
78+
79+
bad = random_string()
80+
flag = '-m' if random.choice([0, 1]) else '--max_word_len'
81+
rv, out = getstatusoutput(f'{prg} {flag} {bad} {words}')
6982
assert rv != 0
7083
assert re.search(f"invalid int value: '{bad}'", out)
7184

@@ -76,11 +89,76 @@ def test_bad_seed():
7689

7790
bad = random_string()
7891
flag = '-s' if random.choice([0, 1]) else '--seed'
79-
rv, out = getstatusoutput(f'{prg} {flag} {bad}')
92+
rv, out = getstatusoutput(f'{prg} {flag} {bad} {words}')
8093
assert rv != 0
8194
assert re.search(f"invalid int value: '{bad}'", out)
8295

8396

97+
# --------------------------------------------------
98+
def test_defaults():
99+
"""Test"""
100+
101+
rv, out = getstatusoutput(f'{prg} -s 1 {words}')
102+
assert rv == 0
103+
assert out.strip() == '\n'.join([
104+
'DuniteBoonLociDefat', 'WegaTitmalUnplatSatire', 'IdeanClipsVitiArriet'
105+
])
106+
107+
108+
# --------------------------------------------------
109+
def test_num():
110+
"""Test"""
111+
112+
rv, out = getstatusoutput(f'{prg} -s 1 -n 1 {words}')
113+
assert rv == 0
114+
assert out.strip() == 'DuniteBoonLociDefat'
115+
116+
117+
# --------------------------------------------------
118+
def test_num_words():
119+
"""Test"""
120+
121+
rv, out = getstatusoutput(f'{prg} -s 1 -w 2 {words}')
122+
assert rv == 0
123+
assert out.strip() == '\n'.join(['DuniteBoon', 'LociDefat', 'WegaTitmal'])
124+
125+
126+
# --------------------------------------------------
127+
def test_min_word_len():
128+
"""Test"""
129+
130+
rv, out = getstatusoutput(f'{prg} -s 1 -m 5 {words}')
131+
assert rv == 0
132+
assert out.strip() == '\n'.join([
133+
'CarneyRapperWabenoUndine', 'BabaiFarerBugleOnlepy',
134+
'UnbittMinnyNatalSkanda'
135+
])
136+
137+
138+
# --------------------------------------------------
139+
def test_max_word_len():
140+
"""Test"""
141+
142+
rv, out = getstatusoutput(f'{prg} -s 1 -x 10 {words}')
143+
assert rv == 0
144+
assert out.strip() == '\n'.join([
145+
'DicemanYardwandBoeberaKismetic', 'CubiculumTilsitSnowcapSuer',
146+
'ProhasteHaddockChristmasyTenonitis'
147+
])
148+
149+
150+
# --------------------------------------------------
151+
def test_l33t():
152+
"""Test"""
153+
154+
rv, out = getstatusoutput(f'{prg} -s 1 -l {words}')
155+
assert rv == 0
156+
assert out.strip() == '\n'.join([
157+
'DUn1Teb0onloCiDef4T/', 'Weg4TiTm@LuNPl4T54+1r3_',
158+
'iD3@Ncl1P5v1+14rrie+/'
159+
])
160+
161+
84162
# --------------------------------------------------
85163
def random_string():
86164
"""generate a random string"""

20_password/unit.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,19 @@ def test_clean():
1515
def test_ransom():
1616
"""Test ransom"""
1717

18+
state = random.getstate()
1819
random.seed(1)
1920
assert (ransom('Money') == 'moNeY')
2021
assert (ransom('Dollars') == 'DOLlaRs')
21-
random.seed(None)
22+
random.setstate(state)
2223

2324

2425
# --------------------------------------------------
2526
def test_l33t():
2627
"""Test l33t"""
2728

29+
state = random.getstate()
2830
random.seed(1)
2931
assert l33t('Money') == 'moNeY{'
3032
assert l33t('Dollars') == 'D0ll4r5`'
31-
random.seed(None)
33+
random.setstate(state)

inputs/.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
words
1+
words.txt

inputs/words.zip

-737 KB
Binary file not shown.

0 commit comments

Comments
 (0)