Sha256: a72126618ebdd93b4541c476e4d742b19a3f4a8f606c00d73388c72ea1194305

Contents?: true

Size: 1.52 KB

Versions: 1

Compression:

Stored size: 1.52 KB

Contents

require 'pwm/version'

##
# This module is the heart of pwm.
module Pwm
  ##
  # The exception raised when a requested password length is too short.
  class TooShortException < Exception; end

  ##
  # The set of characters from which passwords will be assembled.
  # This could be overridden if you don't like the default.
  #
  # Returns the set of characters as an Array.
  def self.characters
    (('A'..'Z').to_a + ('a'..'z').to_a + ('2'..'9').to_a) - %w(I O l)
  end

  ##
  # Generate a password.
  #
  # length - The length of the password. Minimum is 8. Default is 16.
  #
  # Examples
  #
  #   Pwm.password
  #   # => 'SPdHeZnn9rut4AUz'
  #
  #   Pwm.password(8)
  #   # => 'oUX4fmqr'
  #
  # Returns the generated password as a String if length >= 8,
  # or raises exception if length < 8.
  def self.password(length = 16)
    fail Pwm::TooShortException, "#{length} is too short." if length < 8
    password = ''
    until acceptable?(password)
      password = (0..length - 1).reduce('') do |pw, _n|
        pw + characters[rand(characters.length)]
      end
    end
    password
  end

  private

  ##
  # Checks if a password is acceptable.
  #
  # password - the password to check
  #
  # Examples
  #
  #   Pwm.acceptable?('AaBbCc1234')
  #   # => true
  #
  #   Pwm.acceptable?('ABCDEFGHIJ')
  #   # => false
  #
  # Returns true if password has at least one of each required character
  # class, or false if not.
  def self.acceptable?(password)
    password.match(/[A-Z]/) && password.match(/[a-z]/) && password.match(/[0-9]/)
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
pwm-1.2.3 lib/pwm.rb