mongoid_token 1.1.0 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +2 -0
- data/Gemfile +0 -1
- data/README.md +27 -3
- data/benchmarks/benchmark.rb +4 -5
- data/lib/mongoid_token.rb +16 -2
- data/lib/version.rb +1 -1
- data/spec/mongoid.yml +1 -0
- data/spec/mongoid/token_spec.rb +46 -5
- metadata +10 -5
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -15,11 +15,19 @@ Into something more like this:
|
|
15
15
|
http://myawesomewebapp.com/video/83xQ3r/edit
|
16
16
|
|
17
17
|
|
18
|
+
## Mongoid 3.x Support
|
19
|
+
|
20
|
+
As of version 1.1.0, Mongoid::Token now supports Mongoid 3.x.
|
21
|
+
|
22
|
+
> If you still require __Mongoid 2.x__ support, please install
|
23
|
+
> Mongoid::Token 1.0.0.
|
24
|
+
|
25
|
+
|
18
26
|
## Getting started
|
19
27
|
|
20
28
|
In your gemfile, add:
|
21
29
|
|
22
|
-
gem 'mongoid_token', '~> 1.
|
30
|
+
gem 'mongoid_token', '~> 1.1.0'
|
23
31
|
|
24
32
|
Then update your bundle
|
25
33
|
|
@@ -63,9 +71,13 @@ The options for `contains` are as follows:
|
|
63
71
|
|
64
72
|
* `:alphanumeric` - letters (upper and lowercase) and numbers
|
65
73
|
* `:alpha` - letters (upper and lowercase) only
|
74
|
+
* `:alpha_lower` - letters (lowercase) only
|
75
|
+
* `:alpha_upper` - letters (uppercase) only
|
66
76
|
* `:numeric` - numbers only, anything from 1 character long, up to and
|
67
77
|
`length`
|
68
78
|
* `:fixed_numeric` - numbers only, but with the number of characters always the same as `length`
|
79
|
+
* `:fixed_numeric_no_leading_zeros` - as above, but will never start with
|
80
|
+
zeros
|
69
81
|
|
70
82
|
You can also rename the token field, if required, using the
|
71
83
|
`:field_name` option:
|
@@ -77,10 +89,13 @@ You can also rename the token field, if required, using the
|
|
77
89
|
* `token :length => 8, :contains => :alphanumeric` generates something like `8Sdc98dQ`
|
78
90
|
* `token :length => 5, :contains => :alpha` gereates something like
|
79
91
|
`ASlkj`
|
92
|
+
* token :length
|
80
93
|
* `token :length => 4, :contains => :numeric` could generate anything
|
81
94
|
from `0` upto `9999` - but in a random order
|
82
95
|
* `token :length => 4, :contains => :fixed_numeric` will generate
|
83
96
|
anything from `0000` to `9999` in a random order
|
97
|
+
* `token :length => 4, :contains => :fixed_numeric_no_leading_zeros` will
|
98
|
+
generate anything from `1000` to `9999` in a random order
|
84
99
|
|
85
100
|
|
86
101
|
## Finders
|
@@ -127,5 +142,14 @@ If you find a problem, please [submit an issue](http://github.com/thetron/mongoi
|
|
127
142
|
you can). Pull requests and feature requests are always welcome and
|
128
143
|
greatly appreciated.
|
129
144
|
|
130
|
-
Thanks to everyone that has contributed to this gem over the past year
|
131
|
-
|
145
|
+
Thanks to everyone that has contributed to this gem over the past year.
|
146
|
+
Many, many thanks - you guys rawk.
|
147
|
+
|
148
|
+
## Contributors:
|
149
|
+
|
150
|
+
* [olliem](https://github.com/olliem)
|
151
|
+
* [msolli](https://github.com/msolli)
|
152
|
+
* [siong1987](https://github.com/siong1987)
|
153
|
+
* [stephan778](https://github.com/stephan778)
|
154
|
+
* [eagleas](https://github.com/eagleas)
|
155
|
+
* [jamesotron](https://github.com/jamesotron).
|
data/benchmarks/benchmark.rb
CHANGED
@@ -2,25 +2,24 @@ $: << File.expand_path("../../lib", __FILE__)
|
|
2
2
|
|
3
3
|
require 'database_cleaner'
|
4
4
|
require 'mongoid'
|
5
|
-
require 'mongoid-rspec'
|
6
5
|
require 'mongoid_token'
|
7
6
|
require 'benchmark'
|
8
7
|
|
9
8
|
Mongoid.configure do |config|
|
10
|
-
config.
|
9
|
+
config.connect_to("mongoid_token_benchmark")
|
11
10
|
end
|
12
11
|
|
13
12
|
DatabaseCleaner.strategy = :truncation
|
14
13
|
|
15
14
|
# start benchmarks
|
16
15
|
|
17
|
-
|
16
|
+
TOKEN_LENGTH = 8
|
18
17
|
|
19
18
|
class Link
|
20
19
|
include Mongoid::Document
|
21
20
|
include Mongoid::Token
|
22
21
|
field :url
|
23
|
-
token :length =>
|
22
|
+
token :length => TOKEN_LENGTH, :contains => :alphanumeric
|
24
23
|
end
|
25
24
|
|
26
25
|
class NoTokenLink
|
@@ -39,7 +38,7 @@ end
|
|
39
38
|
Link.destroy_all
|
40
39
|
Link.create_indexes
|
41
40
|
num_records = [1, 50, 100, 1000, 2000, 3000, 4000]
|
42
|
-
puts "-- Alphanumeric token of length #{
|
41
|
+
puts "-- Alphanumeric token of length #{TOKEN_LENGTH} (#{62**TOKEN_LENGTH} possible tokens)"
|
43
42
|
Benchmark.bm do |b|
|
44
43
|
num_records.each do |qty|
|
45
44
|
b.report("#{qty.to_s.rjust(5, " ")} records "){ qty.times{ create_link(false) } }
|
data/lib/mongoid_token.rb
CHANGED
@@ -50,16 +50,22 @@ module Mongoid
|
|
50
50
|
end
|
51
51
|
|
52
52
|
def to_param
|
53
|
-
self.send(@token_field_name.to_sym)
|
53
|
+
self.send(@token_field_name.to_sym) || super
|
54
54
|
end
|
55
55
|
|
56
56
|
protected
|
57
57
|
|
58
58
|
def resolve_token_collisions
|
59
59
|
retries = @max_collision_retries
|
60
|
+
|
60
61
|
begin
|
61
62
|
yield
|
62
63
|
rescue Moped::Errors::OperationFailure => e
|
64
|
+
# This is horrible, but seems to be the only way to get the details of the exception?
|
65
|
+
continue unless [11000, 11001].include?(e.details['code'])
|
66
|
+
continue unless e.details['err'] =~ /dup key/ &&
|
67
|
+
e.details['err'] =~ /"#{self.send(@token_field_name.to_sym)}"/
|
68
|
+
|
63
69
|
if (retries -= 1) > 0
|
64
70
|
self.create_token(@token_length, @token_contains)
|
65
71
|
retry
|
@@ -83,7 +89,9 @@ module Mongoid
|
|
83
89
|
end
|
84
90
|
|
85
91
|
def create_token_if_nil(length, characters)
|
86
|
-
|
92
|
+
if self[@token_field_name.to_sym].blank?
|
93
|
+
self.create_token(length, characters)
|
94
|
+
end
|
87
95
|
end
|
88
96
|
|
89
97
|
def generate_token(length, characters = :alphanumeric)
|
@@ -94,8 +102,14 @@ module Mongoid
|
|
94
102
|
rand(10**length).to_s
|
95
103
|
when :fixed_numeric
|
96
104
|
rand(10**length).to_s.rjust(length,rand(10).to_s)
|
105
|
+
when :fixed_numeric_no_leading_zeros
|
106
|
+
(rand(10**length - 10**(length-1)) + 10**(length-1)).to_s
|
97
107
|
when :alpha
|
98
108
|
Array.new(length).map{['A'..'Z','a'..'z'].map{|r|r.to_a}.flatten[rand(52)]}.join
|
109
|
+
when :alpha_lower
|
110
|
+
Array.new(length).map{['a'..'z'].map{|r|r.to_a}.flatten[rand(26)]}.join
|
111
|
+
when :alpha_upper
|
112
|
+
Array.new(length).map{['A'..'Z'].map{|r|r.to_a}.flatten[rand(26)]}.join
|
99
113
|
end
|
100
114
|
end
|
101
115
|
end
|
data/lib/version.rb
CHANGED
data/spec/mongoid.yml
CHANGED
data/spec/mongoid/token_spec.rb
CHANGED
@@ -20,6 +20,8 @@ class Link
|
|
20
20
|
|
21
21
|
field :url
|
22
22
|
token :length => 3, :contains => :alphanumeric
|
23
|
+
|
24
|
+
validates :url, :presence => true
|
23
25
|
end
|
24
26
|
|
25
27
|
class FailLink
|
@@ -37,6 +39,22 @@ class Video
|
|
37
39
|
token :length => 8, :contains => :alpha, :field_name => :vid
|
38
40
|
end
|
39
41
|
|
42
|
+
class Image
|
43
|
+
include Mongoid::Document
|
44
|
+
include Mongoid::Token
|
45
|
+
|
46
|
+
field :url
|
47
|
+
token :length => 8, :contains => :fixed_numeric_no_leading_zeros
|
48
|
+
end
|
49
|
+
|
50
|
+
class Event
|
51
|
+
include Mongoid::Document
|
52
|
+
include Mongoid::Token
|
53
|
+
|
54
|
+
field :name
|
55
|
+
token :length => 8, :contains => :alpha_lower
|
56
|
+
end
|
57
|
+
|
40
58
|
class Node
|
41
59
|
include Mongoid::Document
|
42
60
|
include Mongoid::Token
|
@@ -60,11 +78,15 @@ describe Mongoid::Token do
|
|
60
78
|
@account = Account.create(:name => "Involved Pty. Ltd.")
|
61
79
|
@link = Link.create(:url => "http://involved.com.au")
|
62
80
|
@video = Video.create(:name => "Nyan nyan")
|
81
|
+
@image = Image.create(:url => "http://involved.com.au/image.png")
|
82
|
+
@event = Event.create(:name => "Super cool party!")
|
63
83
|
|
64
84
|
Account.create_indexes
|
65
85
|
Link.create_indexes
|
66
86
|
FailLink.create_indexes
|
67
87
|
Video.create_indexes
|
88
|
+
Image.create_indexes
|
89
|
+
Event.create_indexes
|
68
90
|
Node.create_indexes
|
69
91
|
end
|
70
92
|
|
@@ -78,6 +100,7 @@ describe Mongoid::Token do
|
|
78
100
|
@account.token.length.should == 16
|
79
101
|
@link.token.length.should == 3
|
80
102
|
@video.vid.length.should == 8
|
103
|
+
@image.token.length.should == 8
|
81
104
|
end
|
82
105
|
|
83
106
|
it "should only generate unique tokens" do
|
@@ -106,6 +129,11 @@ describe Mongoid::Token do
|
|
106
129
|
@video = Video.create(:name => "A test video")
|
107
130
|
@video.vid.gsub(/[A-Za-z]/, "").length.should == 0
|
108
131
|
end
|
132
|
+
|
133
|
+
50.times do |index|
|
134
|
+
@event = Event.create(:name => "Super cool party!2")
|
135
|
+
@event.token.gsub(/[a-z]/, "").length.should == 0
|
136
|
+
end
|
109
137
|
end
|
110
138
|
|
111
139
|
it "should create the only after the first save" do
|
@@ -145,7 +173,7 @@ describe Mongoid::Token do
|
|
145
173
|
@account.token.should_not be_nil
|
146
174
|
end
|
147
175
|
|
148
|
-
it "should fail with an exception after 3 retries
|
176
|
+
it "should fail with an exception after 3 retries" do
|
149
177
|
Link.destroy_all
|
150
178
|
Link.create_indexes
|
151
179
|
|
@@ -153,7 +181,6 @@ describe Mongoid::Token do
|
|
153
181
|
Link.any_instance.stub(:generate_token).and_return(@first_link.token)
|
154
182
|
@link = Link.new(:url => "http://fail.com")
|
155
183
|
|
156
|
-
#lambda{ @link.save! }.should raise_error(Mongoid::Token::CollisionRetriesExceeded)
|
157
184
|
expect { @link.save! }.to raise_error(Mongoid::Token::CollisionRetriesExceeded)
|
158
185
|
|
159
186
|
Link.count.should == 1
|
@@ -165,8 +192,13 @@ describe Mongoid::Token do
|
|
165
192
|
|
166
193
|
Link.any_instance.stub(:generate_token).and_return(link.token)
|
167
194
|
|
168
|
-
expect { Link.create!(url: "http://example.com/2") }
|
169
|
-
|
195
|
+
expect { Link.create!(url: "http://example.com/2") }.to raise_error(Mongoid::Token::CollisionRetriesExceeded)
|
196
|
+
end
|
197
|
+
|
198
|
+
it "should not raise a custom error if an operation failure is thrown for another reason" do
|
199
|
+
link = Link.new
|
200
|
+
lambda{ link.save! }.should_not raise_error(Mongoid::Token::CollisionRetriesExceeded)
|
201
|
+
link.valid?.should == false
|
170
202
|
end
|
171
203
|
|
172
204
|
it "should not raise a custom exception if retries are set to zero" do
|
@@ -177,7 +209,7 @@ describe Mongoid::Token do
|
|
177
209
|
Link.any_instance.stub(:generate_token).and_return(@first_link.token)
|
178
210
|
@link = FailLink.new(:url => "http://fail.com")
|
179
211
|
|
180
|
-
lambda{ @link.save }.should_not raise_error(Mongoid::Token::CollisionRetriesExceeded)
|
212
|
+
lambda{ @link.save! }.should_not raise_error(Mongoid::Token::CollisionRetriesExceeded)
|
181
213
|
end
|
182
214
|
|
183
215
|
it "should create unique indexes on embedded documents" do
|
@@ -191,4 +223,13 @@ describe Mongoid::Token do
|
|
191
223
|
node.token.match(/[0-9]{8}/).should_not == nil
|
192
224
|
end
|
193
225
|
end
|
226
|
+
|
227
|
+
describe "with :fixed_numeric_not_null" do
|
228
|
+
it "should not start with 0" do
|
229
|
+
1000.times do
|
230
|
+
image = Image.create(:url => "http://something.com/image.png")
|
231
|
+
image.token.should_not start_with "0"
|
232
|
+
end
|
233
|
+
end
|
234
|
+
end
|
194
235
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongoid_token
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-02-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: mongoid
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,7 +21,12 @@ dependencies:
|
|
21
21
|
version: '3.0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '3.0'
|
25
30
|
description: Mongoid token is a gem for creating random, unique tokens for mongoid
|
26
31
|
documents. Highly configurable and great for making URLs a little more compact.
|
27
32
|
email:
|
@@ -65,7 +70,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
65
70
|
version: '0'
|
66
71
|
requirements: []
|
67
72
|
rubyforge_project: mongoid_token
|
68
|
-
rubygems_version: 1.8.
|
73
|
+
rubygems_version: 1.8.25
|
69
74
|
signing_key:
|
70
75
|
specification_version: 3
|
71
76
|
summary: A little random, unique token generator for Mongoid documents.
|