Skip to content

Commit a9bbf72

Browse files
committed
Pull in some changes from thetron#47
1 parent c10c43e commit a9bbf72

3 files changed

Lines changed: 73 additions & 54 deletions

File tree

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,8 @@ generated character, and are as follows:
152152

153153
* `%s` - any uppercase, lowercase, or numeric character
154154
* `%w` - any uppercase, or lowercase character
155+
* `%a` - any lowercase, or numeric character
156+
* `%A` - any uppercase, or numeric character
155157
* `%c` - any lowercase character
156158
* `%C` - any uppercase character
157159
* `%d` - any digit

lib/mongoid/token/generator.rb

Lines changed: 35 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
# proposed pattern options
2+
# %a - lowercase alphanumeric character
3+
# %A - uppercase alphanumeric character
24
# %c - lowercase character
35
# %C - uppercase character
46
# %d - digit
@@ -12,7 +14,7 @@
1214
module Mongoid
1315
module Token
1416
module Generator
15-
REPLACE_PATTERN = /%((?<character>[cCdDhHpsw]{1})(?<length>\d+(,\d+)?)?)/
17+
REPLACE_PATTERN = /%((?<character>[aAcCdDhHpsw]{1})(?<length>\d+(,\d+)?)?)/
1618

1719
def self.generate(pattern)
1820
pattern.gsub REPLACE_PATTERN do |match|
@@ -21,6 +23,10 @@ def self.generate(pattern)
2123
length = [match_data[:length].to_i, 1].max
2224

2325
case type
26+
when 'a'
27+
alphanumeric(length).downcase
28+
when 'A'
29+
alphanumeric(length).upcase
2430
when 'c'
2531
down_character(length)
2632
when 'C'
@@ -38,42 +44,45 @@ def self.generate(pattern)
3844
when 'w'
3945
alpha(length)
4046
when 'p'
41-
"-"
47+
'-'
4248
end
4349
end
4450
end
4551

46-
private
47-
def self.rand_string_from_chars(chars, length = 1)
48-
Array.new(length).map{ chars.sample }.join
49-
end
52+
class << self
53+
private
5054

51-
def self.down_character(length = 1)
52-
self.rand_string_from_chars ('a'..'z').to_a, length
53-
end
55+
def rand_string_from_chars(chars, length = 1)
56+
Array.new(length).map { chars.sample }.join
57+
end
5458

55-
def self.up_character(length = 1)
56-
self.rand_string_from_chars ('A'..'Z').to_a, length
57-
end
59+
def down_character(length = 1)
60+
rand_string_from_chars ('a'..'z').to_a, length
61+
end
5862

59-
def self.integer(length = 1, base = 10)
60-
(rand(base**length - base**(length-1)) + base**(length-1)).to_s(base)
61-
end
63+
def up_character(length = 1)
64+
rand_string_from_chars ('A'..'Z').to_a, length
65+
end
6266

63-
def self.digits(length = 1, base = 10)
64-
rand(base**length).to_s(base).rjust(length, "0")
65-
end
67+
def integer(length = 1, base = 10)
68+
(rand(base**length - base**(length - 1)) + base**(length - 1)).to_s(base)
69+
end
6670

67-
def self.alpha(length = 1)
68-
self.rand_string_from_chars (('A'..'Z').to_a + ('a'..'z').to_a), length
69-
end
71+
def digits(length = 1, base = 10)
72+
rand(base**length).to_s(base).rjust(length, '0')
73+
end
7074

71-
def self.alphanumeric(length = 1)
72-
(1..length).collect { (i = Kernel.rand(62); i += ((i < 10) ? 48 : ((i < 36) ? 55 : 61 ))).chr }.join
73-
end
75+
def alpha(length = 1)
76+
rand_string_from_chars (('A'..'Z').to_a + ('a'..'z').to_a), length
77+
end
78+
79+
def alphanumeric(length = 1)
80+
(1..length).collect { (i = Kernel.rand(62); i += ((i < 10) ? 48 : ((i < 36) ? 55 : 61))).chr }.join
81+
end
7482

75-
def self.punctuation(length = 1)
76-
self.rand_string_from_chars ['.','-','_','=','+','$'], length
83+
def punctuation(length = 1)
84+
rand_string_from_chars ['.', '-', '_', '=', '+', '$'], length
85+
end
7786
end
7887
end
7988
end
Lines changed: 36 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,65 @@
1-
require File.join(File.dirname(__FILE__), %w[.. .. spec_helper])
1+
require File.join(File.dirname(__FILE__), %w(.. .. spec_helper))
22

33
describe Mongoid::Token::Generator do
4-
describe "#generate" do
5-
it "generates lowercase characters" do
6-
100.times{ Mongoid::Token::Generator.generate("%c").should =~ /[a-z]/ }
4+
describe '#generate' do
5+
it 'generates lowercase alphanumeric characters' do
6+
100.times { Mongoid::Token::Generator.generate('%a').should =~ /[a-z0-9]/ }
77
end
88

9-
it "generates uppercase characters" do
10-
100.times{ Mongoid::Token::Generator.generate("%C").should =~ /[A-Z]/ }
9+
it 'generates uppercase alphanumeric characters' do
10+
100.times { Mongoid::Token::Generator.generate('%A').should =~ /[A-Z0-9]/ }
1111
end
1212

13-
it "generates digits" do
14-
100.times{ Mongoid::Token::Generator.generate("%d").should =~ /[0-9]/ }
13+
it 'generates lowercase characters' do
14+
100.times { Mongoid::Token::Generator.generate('%c').should =~ /[a-z]/ }
1515
end
1616

17-
it "generates non-zero digits" do
18-
100.times{ Mongoid::Token::Generator.generate("%D").should =~ /[1-9]/ }
17+
it 'generates uppercase characters' do
18+
100.times { Mongoid::Token::Generator.generate('%C').should =~ /[A-Z]/ }
1919
end
2020

21-
it "generates hexdigits" do
22-
100.times{ Mongoid::Token::Generator.generate("%h").should =~ /[0-9a-f]/ }
21+
it 'generates digits' do
22+
100.times { Mongoid::Token::Generator.generate('%d').should =~ /[0-9]/ }
2323
end
2424

25-
it "generates non-zero hexdigits" do
26-
100.times{ Mongoid::Token::Generator.generate("%H").should =~ /[1-9a-f]/ }
25+
it 'generates non-zero digits' do
26+
100.times { Mongoid::Token::Generator.generate('%D').should =~ /[1-9]/ }
2727
end
2828

29-
it "generates alphanumeric characters" do
30-
100.times{ Mongoid::Token::Generator.generate("%s").should =~ /[A-Za-z0-9]/ }
29+
it 'generates hexdigits' do
30+
100.times { Mongoid::Token::Generator.generate('%h').should =~ /[0-9a-f]/ }
3131
end
3232

33-
it "generates upper and lowercase characters" do
34-
100.times{ Mongoid::Token::Generator.generate("%w").should =~ /[A-Za-z]/ }
33+
it 'generates non-zero hexdigits' do
34+
100.times { Mongoid::Token::Generator.generate('%H').should =~ /[1-9a-f]/ }
3535
end
3636

37-
it "generates URL-safe punctuation" do
38-
100.times{ Mongoid::Token::Generator.generate("%p").should =~ /[\.\-\_\=\+\$]/ }
37+
it 'generates alphanumeric characters' do
38+
100.times { Mongoid::Token::Generator.generate('%s').should =~ /[A-Za-z0-9]/ }
3939
end
4040

41-
it "generates patterns of a fixed length" do
42-
100.times{ Mongoid::Token::Generator.generate("%s8").should =~ /[A-Za-z0-9]{8}/ }
41+
it 'generates upper and lowercase characters' do
42+
100.times { Mongoid::Token::Generator.generate('%w').should =~ /[A-Za-z]/ }
4343
end
4444

45-
it "generates patterns of a variable length" do
46-
100.times{ Mongoid::Token::Generator.generate("%s1,5").should =~ /[A-Za-z0-9]{1,5}/ }
45+
it 'generates URL-safe punctuation' do
46+
100.times { Mongoid::Token::Generator.generate('%p').should =~ /[\.\-\_\=\+\$]/ }
4747
end
4848

49-
it "generates patterns with static prefixes/suffixes" do
50-
100.times { Mongoid::Token::Generator.generate("prefix-%s4-suffix").should =~ /prefix\-[A-Za-z0-9]{4}\-suffix/ }
49+
it 'generates patterns of a fixed length' do
50+
100.times { Mongoid::Token::Generator.generate('%s8').should =~ /[A-Za-z0-9]{8}/ }
5151
end
5252

53-
it "generates more complex patterns" do
54-
100.times { Mongoid::Token::Generator.generate("pre-%d4-%C3-%d4").should =~ /pre\-[0-9]{4}\-[A-Z]{3}\-[0-9]{4}/ }
53+
it 'generates patterns of a variable length' do
54+
100.times { Mongoid::Token::Generator.generate('%s1,5').should =~ /[A-Za-z0-9]{1,5}/ }
55+
end
56+
57+
it 'generates patterns with static prefixes/suffixes' do
58+
100.times { Mongoid::Token::Generator.generate('prefix-%s4-suffix').should =~ /prefix\-[A-Za-z0-9]{4}\-suffix/ }
59+
end
60+
61+
it 'generates more complex patterns' do
62+
100.times { Mongoid::Token::Generator.generate('pre-%d4-%C3-%d4').should =~ /pre\-[0-9]{4}\-[A-Z]{3}\-[0-9]{4}/ }
5563
end
5664
end
5765
end

0 commit comments

Comments
 (0)