simple-password-gen 0.1.5 → 0.2.0.alpha

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 264fcd0e6c9a3ebe6a356ce5c1a03575308345d8
4
+ data.tar.gz: 6a807e047ca5d8cefba002910bc66290bc82e710
5
+ SHA512:
6
+ metadata.gz: d04aa3bd25eae3ce66a17316ffecb1acc6a1158cae226fdf182f7f4410bc9d183eb87deee5f09dc9a7cd56c0906e0a63684492561560c0e26f03d0407dceda7d
7
+ data.tar.gz: f9b0a10e01cc866c6c2847916d5827ba76e78ef8666c7d1a38f13fe326df0c6035f81c7565140582f17acc9bd322d955a8c147bd6013818130c6f6b7d34dd7a5
data/.gitignore CHANGED
@@ -2,3 +2,4 @@ html/*
2
2
  pkg/*
3
3
  *.gem
4
4
  .bundle
5
+ .ruby-*
@@ -0,0 +1,17 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ simple-password-gen (0.1.5)
5
+
6
+ GEM
7
+ remote: http://rubygems.org/
8
+ specs:
9
+
10
+ PLATFORMS
11
+ ruby
12
+
13
+ DEPENDENCIES
14
+ simple-password-gen!
15
+
16
+ BUNDLED WITH
17
+ 1.12.5
@@ -1,40 +1,42 @@
1
1
  == Simple Password Generator
2
2
 
3
- This class will generate either a pronouncable or complete random
3
+ This class will generate either a pronounceable or complete random
4
4
  password.
5
5
 
6
6
  == Installation
7
7
 
8
8
  Simply install the generator with Rubygems:
9
9
 
10
- $ gem install simple-password-generator
10
+ $ gem install simple-password-gen
11
11
 
12
12
  == Example
13
13
 
14
- You may +require+ this file and generate some password, like:
14
+ You may +require+ this file and generate some passwords, like:
15
15
 
16
- require 'simple-password-generator'
17
- puts Password.pronouncable # => "nduslihefrash"
18
- puts Password.random(4) # => "w'ds"
19
- pw = Password.new (1..10) # => #<Password:0x9678514 ...>
20
- pw.pronouncable # => "t"
21
- pw.pronouncable # => "vostyhish"
22
- pw.random # => "8+a"
16
+ require 'simple-password-gen'
17
+ puts Password.pronounceable # => "nduslihefrash"
18
+ puts Password.random(4) # => "w'ds"
19
+ pw = Password.new (1..10) # => #<Password:0x9678514 ...>
20
+ pw.pronounceable # => "t"
21
+ pw.pronounceable # => "vostyhish"
22
+ pw.random # => "8+a"
23
23
  ...
24
24
 
25
25
  == Synopsis
26
26
 
27
- Alternatively, you may simply run this file as commandline application:
27
+ Alternatively, you may simply run this file as command line application:
28
28
 
29
- $ simple-password-generator -h
30
- simple-password-generator [--length/-l len] [--number/-n num]
31
- Generates <n> password(s) with appox. length <len>.
32
- Will fail if n is less than 1 or len is less than 5.
33
- Defaults: length=10, number=3
29
+ $ simple-password-gen -h
30
+ simple-password-gen [--length/-l LEN] [--number/-n NUM]
31
+ Generates <NUM> password(s) with appox. length <LEN>.
32
+ Will fail if NUM is less than 1 or LEN is less than 5.
33
+ Defaults: LEN=10, NUM=3
34
34
 
35
- == Author
35
+ == Author and Contributors
36
36
 
37
- Dominik Menke, <tt>dmke(at)tzi(dot)org</tt>
37
+ Written by Dominik Menke, <tt>dominik(dot)menke(at)gmail(dot)com</tt>
38
+
39
+ Some typo fixes by @tanraya (Andrew).
38
40
 
39
41
  == License
40
42
 
data/Rakefile CHANGED
@@ -1,5 +1,5 @@
1
1
  require 'bundler'
2
- require 'rake/rdoctask'
2
+ require 'rdoc/task'
3
3
  Bundler::GemHelper.install_tasks
4
4
 
5
5
  Rake::RDocTask.new(:docs) do |rd|
@@ -8,18 +8,18 @@ require 'simple-password-gen'
8
8
  length = (9..11)
9
9
  number = 3
10
10
  GetoptLong.new(
11
- [ '--length', '-l', GetoptLong::REQUIRED_ARGUMENT ],
12
- [ '--number', '-n', GetoptLong::REQUIRED_ARGUMENT ],
13
- [ '--help', '-h', GetoptLong::NO_ARGUMENT ]
11
+ ['--length', '-l', GetoptLong::REQUIRED_ARGUMENT],
12
+ ['--number', '-n', GetoptLong::REQUIRED_ARGUMENT],
13
+ ['--help', '-h', GetoptLong::NO_ARGUMENT]
14
14
  ).each do |opt,arg|
15
15
  case opt
16
16
  when '--length'
17
17
  l = arg.to_i
18
- length = Range.new(l - 1, l + 1)
19
- if length.begin < 5
18
+ if l < 5
20
19
  puts "Srsly?"
21
20
  exit 1
22
21
  end
22
+ length = Range.new(l - 1, l + 1)
23
23
  when '--number'
24
24
  number = arg.to_i
25
25
  if number < 1
@@ -27,20 +27,34 @@ GetoptLong.new(
27
27
  exit 1
28
28
  end
29
29
  when '--help'
30
- puts "#{$0} [--length/-l len] [--number/-n num]"
31
- puts "\tGenerates <n> password(s) with appox. length <len>."
32
- puts "\tWill fail if n is less than 1 or len is less than 5."
33
- puts "\tDefaults: length=10, number=3"
30
+ puts "#{$0} [--length/-l LEN] [--number/-n NUM]"
31
+ puts "\tGenerates <NUM> password(s) with appox. length <LEN>."
32
+ puts "\tWill fail if NUM is less than 1 or LEN is less than 5."
33
+ puts "\tDefaults: LEN=10, NUM=3"
34
34
  exit
35
35
  end
36
36
  end
37
37
 
38
- # so, finally:
39
- row = '%%-%ds | %%s' % length.begin
40
- row = '%-20s | %s' if length.begin < 20
41
- puts row % ['Pronounceable', 'Random']
42
- puts '=' * 80
43
- pw = Password.new(length)
44
- number.times do
45
- puts row % [pw.pronounceable, pw.random]
38
+ columns = {
39
+ pronounceable: "Pronounceable",
40
+ random: "Random",
41
+ urlsafe: "URL safe",
42
+ }
43
+
44
+ generator = Password.new(length)
45
+ header = columns.values
46
+ passwords = (0...number).map { columns.keys.map{|k| generator.send(k) } }
47
+ markup = " %*s | %*s | %*s "
48
+
49
+ widths = passwords.each_with_object(header.map(&:size)) {|pws, max|
50
+ (0...max.size).each {|i|
51
+ max[i] = pws[i].size if pws[i].size > max[i]
52
+ }
53
+ }.map{|w| -w }
54
+
55
+ puts markup % widths.zip(header).flatten
56
+ print "-", widths.map{|w| "-" * -w }.join("--+--"), "-\n"
57
+
58
+ passwords.each do |list|
59
+ puts markup % widths.zip(list).flatten
46
60
  end
@@ -1,58 +1,97 @@
1
1
  # encoding: utf-8
2
2
 
3
- # A simple Password generator. Central parts are based on
4
- # http://snippets.dzone.com/posts/show/2137 and comments.
3
+ # A simple Password generator. Central parts are based on a DZone snippet and its comments:
4
+ # https://web.archive.org/web/20090204082442/http://snippets.dzone.com/posts/show/2137
5
5
  class Password
6
- # consonantes and pronounceable combinations with vowels
7
- CONSONANTS = %w(b c d f g h j k l m n p qu r s t v w x z ch cr fr nd ng nk nt ph pr rd sch sh sl sp st th tr)
8
- # vowels and sound-alike +y+
9
- VOWELS = %w(a e i o u y)
10
- # some characters
11
- CHARS = (('A'..'Z').to_a + ('a'..'z').to_a + ('0'..'9').to_a + "%&/()[]!\"§$,.-;:_#'+*?".split(//u)) - "io01lO".split(//u)
6
+ module CharacterSets
7
+ SAFE_CHARS = ("A".."Z").to_a | ("a".."z").to_a | ("0".."9").to_a | "-_.,;+!*()[]{}|~^<>\"'$=".split(//)
8
+ URL_UNSAFE = "#%/:@&?".split(//)
9
+ LOOKALIKE = "|io01lO".split(//)
10
+
11
+ ALL_CHARS = SAFE_CHARS | URL_UNSAFE
12
+ URL_SAFE = SAFE_CHARS
13
+ VISUAL_SAFE = SAFE_CHARS - LOOKALIKE
14
+
15
+ CONSONANTS = %w( b c d f g h j k l m n p r s t v w x z)
16
+ VOWELS = %w(a e i o u y)
17
+ COMPOUND = CONSONANTS | %w(ch cr fr nd ng nk nt ph pr qu rd sch sh sl sp st th tr)
18
+ end
19
+
20
+
21
+ # default length range value for new password generator instances
22
+ DEFAULT_LENGTH = 8..12
23
+
24
+ # the possible length values
25
+ attr_reader :length
12
26
 
13
27
  # Creates a new password generator. The length +len+ might be an
14
- # +Integer+ or a +Range+.
15
- def initialize len = (8..12)
16
- if len.is_a? Integer
17
- @length = Range.new(len-1, len+1)
18
- elsif len.is_a? Range
19
- @length = len
20
- else
21
- raise ArgumentException, "Length is neither an Integer nor a Range."
22
- end
28
+ # +Integer+, an +Array+ or a +Range+.
29
+ def initialize(len = DEFAULT_LENGTH)
30
+ coerce_length! len
23
31
  end
24
32
 
25
33
  class << self
26
- # Similar to #pronounceable, this generates a pronounceable password.
27
- def pronounceable len = (8..12)
28
- self.new(len).pronounceable
34
+ # Short-hand for +#new.pronouncable+.
35
+ def pronounceable(len = DEFAULT_LENGTH)
36
+ new(len).pronounceable
29
37
  end
30
38
 
31
- # Similar to #random, this generates a random password.
32
- def random len = (8..12)
33
- self.new(len).random
39
+ # Short-hand for +#new.random+.
40
+ def random(len = DEFAULT_LENGTH)
41
+ new(len).random
42
+ end
43
+
44
+ # Short-hand for +#new.urlsafe+.
45
+ def urlsafe(len = DEFAULT_LENGTH)
46
+ new(len).urlsafe
34
47
  end
35
48
  end
36
49
 
37
50
  # Generates a pronounceable password.
38
51
  def pronounceable
39
- size = @length.to_a[rand(@length.count)] - 2
40
- f, pw = true, ''
41
- size.times do
42
- pw << (f ? CONSONANTS[rand * CONSONANTS.size] : VOWELS[rand * VOWELS.size])
43
- f = !f
44
- end
45
- pw
52
+ set = rand > 0.5
53
+
54
+ build_password {
55
+ set = !set
56
+ set ? CharacterSets::CONSONANTS.sample : CharacterSets::VOWELS.sample
57
+ }
46
58
  end
47
59
 
48
60
  # Unlike #pronounceable, this does not ensure the pronounceability and
49
61
  # will include some special characters, but will exclude "unfriendly"
50
62
  # characters (like +0+, +O+).
51
63
  def random
52
- size = @length.to_a[rand(@length.count)]
53
- (1..size).collect do |a|
54
- CHARS[rand(CHARS.size)]
55
- end.join ''
64
+ build_password { CharacterSets::ALL_CHARS.sample }
56
65
  end
57
- end
58
66
 
67
+ # Generates a passwort suitable for usage in HTTP(S) URLs, i.e. the
68
+ # following characters are excluded: +:@/+.
69
+ def urlsafe
70
+ build_password { CharacterSets::URL_SAFE.sample }
71
+ end
72
+
73
+ private
74
+
75
+ def build_password
76
+ size, pw = length.sample, ''
77
+ while pw.size <= size
78
+ pw << yield
79
+ end
80
+ pw
81
+ end
82
+
83
+ def coerce_length!(len)
84
+ length = case len
85
+ when NilClass then DEFAULT_LENGTH.to_a
86
+ when Integer then (len-1 .. len+1).to_a
87
+ when Range then len.to_a
88
+ when Array then len
89
+ else raise ArgumentException, "Length is neither an Integer nor a Range (got #{len.class})."
90
+ end.select{|i| i.is_a?(Integer) && i > 0 }.sort.uniq
91
+
92
+ raise TypeError, "Cannot coerce #{len} (#{len.class}) into Password length" if length.empty?
93
+
94
+ @length = length
95
+ end
96
+
97
+ end
@@ -1,8 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  class Password
4
- MAJOR = 0 # :nodoc:
5
- MINOR = 1 # :nodoc:
6
- PATCH = 5 # :nodoc:
7
- VERSION = [MAJOR, MINOR, PATCH].join '.' # :nodoc:
2
+ VERSION = "0.2.0.alpha"
8
3
  end
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  $:.push File.expand_path("../lib", __FILE__)
3
2
  require "simple-password-gen/version"
4
3
 
@@ -7,18 +6,12 @@ Gem::Specification.new do |s|
7
6
  s.version = Password::VERSION
8
7
  s.platform = Gem::Platform::RUBY
9
8
  s.authors = ["Dominik Menke"]
10
- s.email = ["dmke@tzi.de"]
9
+ s.email = ["dominik.menke@gmail.com"]
11
10
  s.homepage = "http://github.org/dmke/simple-password-gen"
12
11
  s.summary = %q{Simple password generator to create pronounceable or random passowords.}
13
- s.description = s.summary + "\n\nThis gem comes with an executable and might also be required."
14
12
 
15
13
  s.files = `git ls-files`.split("\n")
16
14
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
15
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
16
  s.require_paths = ["lib"]
19
-
20
- s.rdoc_options << '--title' << 'Simple Password Generator' <<
21
- '--main' << 'README.rdoc' << '--show-hash' <<
22
- `git ls-files -- lib/*`.split("\n") <<
23
- 'README.rdoc' << 'LICENSE'
24
17
  end
metadata CHANGED
@@ -1,38 +1,26 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: simple-password-gen
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 1
8
- - 5
9
- version: 0.1.5
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0.alpha
10
5
  platform: ruby
11
- authors:
6
+ authors:
12
7
  - Dominik Menke
13
8
  autorequire:
14
9
  bindir: bin
15
10
  cert_chain: []
16
-
17
- date: 2011-01-21 00:00:00 +01:00
18
- default_executable:
11
+ date: 2016-06-06 00:00:00.000000000 Z
19
12
  dependencies: []
20
-
21
- description: |-
22
- Simple password generator to create pronounceable or random passowords.
23
-
24
- This gem comes with an executable and might also be required.
25
- email:
26
- - dmke@tzi.de
27
- executables:
13
+ description:
14
+ email:
15
+ - dominik.menke@gmail.com
16
+ executables:
28
17
  - simple-password-gen
29
18
  extensions: []
30
-
31
19
  extra_rdoc_files: []
32
-
33
- files:
34
- - .gitignore
20
+ files:
21
+ - ".gitignore"
35
22
  - Gemfile
23
+ - Gemfile.lock
36
24
  - LICENSE
37
25
  - README.rdoc
38
26
  - Rakefile
@@ -40,45 +28,27 @@ files:
40
28
  - lib/simple-password-gen.rb
41
29
  - lib/simple-password-gen/version.rb
42
30
  - simple-password-gen.gemspec
43
- has_rdoc: true
44
31
  homepage: http://github.org/dmke/simple-password-gen
45
32
  licenses: []
46
-
33
+ metadata: {}
47
34
  post_install_message:
48
- rdoc_options:
49
- - --title
50
- - Simple Password Generator
51
- - --main
52
- - README.rdoc
53
- - --show-hash
54
- - - lib/simple-password-gen.rb
55
- - lib/simple-password-gen/version.rb
56
- - README.rdoc
57
- - LICENSE
58
- require_paths:
35
+ rdoc_options: []
36
+ require_paths:
59
37
  - lib
60
- required_ruby_version: !ruby/object:Gem::Requirement
61
- none: false
62
- requirements:
63
- - - ">="
64
- - !ruby/object:Gem::Version
65
- segments:
66
- - 0
67
- version: "0"
68
- required_rubygems_version: !ruby/object:Gem::Requirement
69
- none: false
70
- requirements:
38
+ required_ruby_version: !ruby/object:Gem::Requirement
39
+ requirements:
71
40
  - - ">="
72
- - !ruby/object:Gem::Version
73
- segments:
74
- - 0
75
- version: "0"
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ required_rubygems_version: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">"
46
+ - !ruby/object:Gem::Version
47
+ version: 1.3.1
76
48
  requirements: []
77
-
78
49
  rubyforge_project:
79
- rubygems_version: 1.3.7
50
+ rubygems_version: 2.5.1
80
51
  signing_key:
81
- specification_version: 3
52
+ specification_version: 4
82
53
  summary: Simple password generator to create pronounceable or random passowords.
83
54
  test_files: []
84
-