diff --git a/README.md b/README.md index 148024e..67265bc 100644 --- a/README.md +++ b/README.md @@ -135,6 +135,8 @@ generated character, and are as follows: * `%s` - any uppercase, lowercase, or numeric character * `%w` - any uppercase, or lowercase character +* `%a` - any lowercase, or numeric character +* `%A` - any uppercase, or numeric character * `%c` - any lowercase character * `%C` - any uppercase character * `%d` - any digit diff --git a/lib/mongoid/token/generator.rb b/lib/mongoid/token/generator.rb index f7c039c..1e2dabe 100644 --- a/lib/mongoid/token/generator.rb +++ b/lib/mongoid/token/generator.rb @@ -1,4 +1,6 @@ # proposed pattern options +# %a - lowercase alphanumeric character +# %A - uppercase alphanumeric character # %c - lowercase character # %C - uppercase character # %d - digit @@ -12,7 +14,7 @@ module Mongoid module Token module Generator - REPLACE_PATTERN = /%((?[cCdDpsw]{1})(?\d+(,\d+)?)?)/ + REPLACE_PATTERN = /%((?[aAcCdDpsw]{1})(?\d+(,\d+)?)?)/ def self.generate(pattern) pattern.gsub REPLACE_PATTERN do |match| @@ -21,12 +23,16 @@ def self.generate(pattern) length = [match_data[:length].to_i, 1].max case type + when 'a' + alphanumeric(length).downcase + when 'A' + alphanumeric(length).upcase when 'c' - down_character(length) + alpha(length).downcase when 'C' - up_character(length) + alpha(length).upcase when 'd' - digits(length) + numeric(length) when 'D' integer(length) when 's' @@ -44,20 +50,12 @@ def self.rand_string_from_chars(chars, length = 1) Array.new(length).map{ chars.sample }.join end - def self.down_character(length = 1) - self.rand_string_from_chars ('a'..'z').to_a, length - end - - def self.up_character(length = 1) - self.rand_string_from_chars ('A'..'Z').to_a, length - end - def self.integer(length = 1) - (rand(10**length - 10**(length-1)) + 10**(length-1)).to_s + ('1'..'9').to_a.sample + self.numeric(length - 1) end - def self.digits(length = 1) - rand(10**length).to_s.rjust(length, "0") + def self.numeric(length = 1) + self.rand_string_from_chars ('0'..'9').to_a, length end def self.alpha(length = 1) @@ -65,7 +63,7 @@ def self.alpha(length = 1) end def self.alphanumeric(length = 1) - (1..length).collect { (i = Kernel.rand(62); i += ((i < 10) ? 48 : ((i < 36) ? 55 : 61 ))).chr }.join + self.rand_string_from_chars (('0'..'9').to_a + ('A'..'Z').to_a + ('a'..'z').to_a), length end def self.punctuation(length = 1) diff --git a/spec/mongoid/token/generator_spec.rb b/spec/mongoid/token/generator_spec.rb index fc751b4..b802ef1 100644 --- a/spec/mongoid/token/generator_spec.rb +++ b/spec/mongoid/token/generator_spec.rb @@ -2,6 +2,14 @@ describe Mongoid::Token::Generator do describe "#generate" do + it "generates lowercase alphanumeric characters" do + 100.times{ Mongoid::Token::Generator.generate("%a").should =~ /[a-z0-9]/ } + end + + it "generates uppercase alphanumeric characters" do + 100.times{ Mongoid::Token::Generator.generate("%A").should =~ /[A-Z0-9]/ } + end + it "generates lowercase characters" do 100.times{ Mongoid::Token::Generator.generate("%c").should =~ /[a-z]/ } end