password_generate 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/password_generate.rb +133 -0
  3. metadata +45 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d2da48eb146ee09d2349e32caa8cf504a3832155
4
+ data.tar.gz: d9da177ddd8ee2680dbdd8cadc3cb15f2c893223
5
+ SHA512:
6
+ metadata.gz: 9cba1cff8c9e5bbb328c76d94abc7e14a2ccb0131a8048e6b67d9100d04879ce4c0fea12b683fb2bacea544cf2378680e9fcdb23fa29d0db5869fe6408d0cfa3
7
+ data.tar.gz: 1a8bc211053d052a452438f54119fd96b4efaffad6af7a13237f3c8969eba414457dbbbaccea326175f8970c39175a34ce1dcd9600d9547600439568a0812bf6
@@ -0,0 +1,133 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ ##
4
+ # usage:
5
+ # ./password_generate.rb mode length
6
+ # ./password_generate.rb mode
7
+ # ./password_generate.rb length
8
+ # ./password_generate.rb
9
+ #
10
+ # mode = m[ixed]|a[lphanum]|n[um] ; default mixed
11
+ # length = (integer >= 3) ; default = 12
12
+ #
13
+ # ----- as package -----
14
+ # require 'password_generate'
15
+ # p PasswordGenerate.generate mode, length
16
+ # p PasswordGenerate.generate mode
17
+ # p PasswordGenerate.generate length
18
+ # p PasswordGenerate.generate
19
+ ##
20
+
21
+ class Object
22
+ def is_number?
23
+ self.to_f.to_s == self.to_s || self.to_i.to_s == self.to_s
24
+ end
25
+ end
26
+
27
+ module PasswordGenerate
28
+
29
+ ## setup chars pool
30
+
31
+ # no Ii Ll Oo 0 1
32
+ ALPHA = 'ABCDEFGHJKMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz'
33
+ NUM = '23456789'
34
+ SYMBOL = '_'
35
+
36
+ def self.generate mode = nil, length = nil
37
+
38
+ ## normalize args
39
+
40
+ mode = case mode.to_s[0]
41
+ when 'm' then 'mixed'
42
+ when 'a' then 'alphanum'
43
+ when 'n' then 'num'
44
+ else 'mixed'
45
+ end
46
+
47
+ length = 12 unless length.is_number?
48
+ length = 3 if length.to_i < 3
49
+ length = length.to_i
50
+
51
+ pool = case mode
52
+ when 'num' then NUM
53
+ when 'alphanum' then ALPHA + NUM
54
+ when 'mixed' then SYMBOL + ALPHA + NUM
55
+ end
56
+
57
+ ## fill in password places
58
+
59
+ password = {}
60
+ spots = (0..length-1).to_a
61
+
62
+ # first select a random non-first place to put a symbol in
63
+ if mode == 'mixed'
64
+ bit = pick SYMBOL
65
+ key = pick (0..spots.size-1).to_a
66
+ pos = spots[key]
67
+ pos = 1 if pos == 0
68
+ fill password, bit, spots, pos, key
69
+ end
70
+
71
+ # put first as alpha
72
+ if mode == 'alphanum' || mode == 'mixed'
73
+ bit = pick ALPHA
74
+ fill password, bit, spots, 0, 0
75
+ end
76
+
77
+ # ensure at least one num present
78
+ bit = pick NUM
79
+ key = pick (0..spots.size-1).to_a
80
+ pos = spots[key]
81
+ fill password, bit, spots, pos, key
82
+
83
+ # fill remaining
84
+ spots.each do |v|
85
+ # disallow adjacent same char
86
+ loop do
87
+ bit = pick pool
88
+ break if v == 0 || bit != password[v-1]
89
+ end
90
+
91
+ fill password, bit, spots, v
92
+ end
93
+
94
+ ## format password into a string
95
+
96
+ password.sort.map { |v| v[1] }.join('')
97
+ end
98
+
99
+ def self.pick pool
100
+ v = nil
101
+ v = pool.split('').sample if pool.respond_to? :split
102
+ v = pool.sample if pool.respond_to? :sample
103
+ v
104
+ end
105
+
106
+ def self.fill password, bit, spots, pos, key = nil
107
+ password[pos] = bit
108
+ spots.delete_at key unless key == nil
109
+ end
110
+
111
+ end # module
112
+
113
+ ## main
114
+
115
+ if __FILE__ == $0 # run as script
116
+
117
+ mode = nil
118
+ length = nil
119
+
120
+ if ARGV.size > 0
121
+ arg = ARGV[0]
122
+ if arg.is_number? # this is a number, parse as [length]
123
+ length = arg
124
+ else # else parse as [mode]
125
+ mode = arg
126
+ end
127
+
128
+ length = ARGV[1] if ARGV.size > 1 # parse a possible 2nd [length]
129
+ end
130
+
131
+ puts PasswordGenerate.generate mode, length
132
+
133
+ end
metadata ADDED
@@ -0,0 +1,45 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: password_generate
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Yulij Andreevich Lesov
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-07-03 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Password generator
14
+ email:
15
+ - yalesov@gmail.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/password_generate.rb
21
+ homepage:
22
+ licenses:
23
+ - ISC
24
+ metadata: {}
25
+ post_install_message:
26
+ rdoc_options: []
27
+ require_paths:
28
+ - lib
29
+ required_ruby_version: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ required_rubygems_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ requirements: []
40
+ rubyforge_project:
41
+ rubygems_version: 2.5.1
42
+ signing_key:
43
+ specification_version: 4
44
+ summary: Password generator
45
+ test_files: []