class PasswordGenerator::Generator

Attributes

length[R]
letters[R]
options[R]

Public Class Methods

new(length, options) click to toggle source

@param length [Fixnum] @param options [GENERATE_OptArg]

# File lib/password_generator.rb, line 32
def initialize(length, options)
  @length, @options = length, options
  @letters = generate_letters.freeze
end

Public Instance Methods

generate() click to toggle source

@return [String]

# File lib/password_generator.rb, line 38
def generate
  llen = letters.length

  # `Array#sample` accepts random generator.
  # But the feature/syntax makes my anxiety :(
  length.times.map{letters.fetch(SecureRandom.random_number(llen))}.join
end

Private Instance Methods

generate_letters() click to toggle source

@return [Array<String>]

# File lib/password_generator.rb, line 49
def generate_letters
  [].tap {|list|
    list.concat(DOWNCASES) unless options.avoid_downcases
    list.concat(UPPERCASES) unless options.avoid_uppercases
    list.concat(NUMBERS) unless options.avoid_numbers
    list.concat(SYMBOLS) unless options.avoid_symbols
    list.push(WHITESPACE) unless options.avoid_whitespace

    unless list.length >= 2
      raise ArgumentError, "using letter-list is too short: #{list.inspect}"
    end
  }
end