Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
30 changes: 14 additions & 16 deletions lib/mongoid/token/generator.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
# proposed pattern options
# %a - lowercase alphanumeric character
# %A - uppercase alphanumeric character
# %c - lowercase character
# %C - uppercase character
# %d - digit
Expand All @@ -12,7 +14,7 @@
module Mongoid
module Token
module Generator
REPLACE_PATTERN = /%((?<character>[cCdDpsw]{1})(?<length>\d+(,\d+)?)?)/
REPLACE_PATTERN = /%((?<character>[aAcCdDpsw]{1})(?<length>\d+(,\d+)?)?)/

def self.generate(pattern)
pattern.gsub REPLACE_PATTERN do |match|
Expand All @@ -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'
Expand All @@ -44,28 +50,20 @@ 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)
self.rand_string_from_chars (('A'..'Z').to_a + ('a'..'z').to_a), length
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)
Expand Down
8 changes: 8 additions & 0 deletions spec/mongoid/token/generator_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down