mongoid_token 0.9.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/Gemfile +3 -2
- data/README.md +42 -3
- data/benchmarks/benchmark.rb +50 -0
- data/lib/mongoid/token/exceptions.rb +16 -0
- data/lib/mongoid_token.rb +74 -24
- data/lib/version.rb +1 -1
- data/mongoid_token.gemspec +2 -2
- data/spec/mongoid/token_spec.rb +87 -7
- data/spec/spec_helper.rb +9 -0
- metadata +33 -39
- data/lib/.DS_Store +0 -0
- data/spec/.DS_Store +0 -0
data/.gitignore
CHANGED
data/Gemfile
CHANGED
@@ -4,11 +4,12 @@ source "http://rubygems.org"
|
|
4
4
|
gemspec
|
5
5
|
|
6
6
|
group :test do
|
7
|
+
gem 'activesupport', '~> 3.0'
|
7
8
|
gem 'database_cleaner'
|
8
|
-
gem 'rspec'
|
9
|
+
gem 'rspec', '2.5.0'
|
9
10
|
gem 'autotest'
|
10
11
|
gem 'autotest-growl'
|
11
|
-
gem 'mongoid', '
|
12
|
+
gem 'mongoid', '2.0.0'
|
12
13
|
gem 'bson_ext'
|
13
14
|
gem 'mongoid-rspec'
|
14
15
|
end
|
data/README.md
CHANGED
@@ -17,7 +17,7 @@ Into something more like this:
|
|
17
17
|
|
18
18
|
In your gemfile, add:
|
19
19
|
|
20
|
-
gem 'mongoid_token', '
|
20
|
+
gem 'mongoid_token', '~> 1.0.0'
|
21
21
|
|
22
22
|
Then update your bundle
|
23
23
|
|
@@ -43,10 +43,17 @@ end
|
|
43
43
|
Obviously, this will create tokens of 8 characters long - make them as
|
44
44
|
short or as long as you require.
|
45
45
|
|
46
|
+
__Note:__ Mongoid::Token leverages Mongoid's 'safe mode' by
|
47
|
+
automatically creating a unique index on your documents using the token
|
48
|
+
field. In order to take advantage of this feature (and ensure that your
|
49
|
+
documents always have unique tokens) remember to create your indexes.
|
50
|
+
|
51
|
+
See 'Token collision/duplicate prevention' below for more details.
|
52
|
+
|
46
53
|
|
47
54
|
## Options
|
48
55
|
|
49
|
-
The `token` method
|
56
|
+
The `token` method has a couple of key options: `length`, which determines the
|
50
57
|
length (or maximum length, in some cases) and `contains`, which tells
|
51
58
|
Mongoid::Token which characters to use when generating the token.
|
52
59
|
|
@@ -58,6 +65,11 @@ The options for `contains` are as follows:
|
|
58
65
|
`length`
|
59
66
|
* `:fixed_numeric` - numbers only, but with the number of characters always the same as `length`
|
60
67
|
|
68
|
+
You can also rename the token field, if required, using the
|
69
|
+
`:field_name` option:
|
70
|
+
|
71
|
+
* `token :contains => :numeric, :field_name => :purchase_order_number`
|
72
|
+
|
61
73
|
### Examples:
|
62
74
|
|
63
75
|
* `token :length => 8, :contains => :alphanumeric` generates something like `8Sdc98dQ`
|
@@ -84,7 +96,34 @@ tokens to - all you need to do is save each of your models and they will
|
|
84
96
|
be assigned a token, if it's missing.
|
85
97
|
|
86
98
|
|
99
|
+
## Token collision/duplicate prevention
|
100
|
+
|
101
|
+
Mongoid::Token leverages Mongoid's 'safe mode' by
|
102
|
+
automatically creating a unique index on your documents using the token
|
103
|
+
field. In order to take advantage of this feature (and ensure that your
|
104
|
+
documents always have unique tokens) remember to create your indexes.
|
105
|
+
|
106
|
+
You can read more about indexes in the [Mongoid docs](http://mongoid.org/docs/indexing.html).
|
107
|
+
|
108
|
+
Additionally, Mongoid::Token will attempt to create a token 3 times
|
109
|
+
before eventually giving up and raising a
|
110
|
+
`Mongoid::Token::CollisionRetriesExceeded` exception. To take advantage
|
111
|
+
of this, one must set `persist_in_safe_mode = true` in your Mongoid
|
112
|
+
configuration.
|
113
|
+
|
114
|
+
The number of retry attempts is adjustable in the `token` method using the
|
115
|
+
`:retry` options. Set it to zero to turn off retrying.
|
116
|
+
|
117
|
+
* `token :length => 6, :retry => 4` Will retry token generation 4
|
118
|
+
times before bailing out
|
119
|
+
* `token :length => 3, :retry => 0` Retrying disabled
|
120
|
+
|
121
|
+
|
87
122
|
# Notes
|
88
123
|
|
89
124
|
If you find a problem, please [submit an issue](http://github.com/thetron/mongoid_token/issues) (and a failing test, if
|
90
|
-
you can). Pull requests and feature requests are always welcome
|
125
|
+
you can). Pull requests and feature requests are always welcome and
|
126
|
+
greatly appreciated.
|
127
|
+
|
128
|
+
Thanks to everyone that has contributed to this gem over the past year,
|
129
|
+
in particular [eagleas](https://github.com/eagleas) and [jamesotron](https://github.com/jamesotron). Many, many thanks guys.
|
@@ -0,0 +1,50 @@
|
|
1
|
+
$: << File.expand_path("../../lib", __FILE__)
|
2
|
+
|
3
|
+
require 'database_cleaner'
|
4
|
+
require 'mongoid'
|
5
|
+
require 'mongoid-rspec'
|
6
|
+
require 'mongoid_token'
|
7
|
+
require 'benchmark'
|
8
|
+
|
9
|
+
Mongoid.configure do |config|
|
10
|
+
config.master = Mongo::Connection.new.db("mongoid_token_benchmark")
|
11
|
+
end
|
12
|
+
|
13
|
+
DatabaseCleaner.strategy = :truncation
|
14
|
+
|
15
|
+
# start benchmarks
|
16
|
+
|
17
|
+
token_length = 2
|
18
|
+
|
19
|
+
class Link
|
20
|
+
include Mongoid::Document
|
21
|
+
include Mongoid::Token
|
22
|
+
field :url
|
23
|
+
token :length => 2, :contains => :alphanumeric
|
24
|
+
end
|
25
|
+
|
26
|
+
class NoTokenLink
|
27
|
+
include Mongoid::Document
|
28
|
+
field :url
|
29
|
+
end
|
30
|
+
|
31
|
+
def create_link(token = true)
|
32
|
+
if token
|
33
|
+
Link.create(:url => "http://involved.com.au")
|
34
|
+
else
|
35
|
+
NoTokenLink.create(:url => "http://involved.com.au")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
Link.destroy_all
|
40
|
+
Link.create_indexes
|
41
|
+
num_records = [1, 50, 100, 1000, 2000, 3000, 4000]
|
42
|
+
puts "-- Alphanumeric token of length #{token_length} (#{62**token_length} possible tokens)"
|
43
|
+
Benchmark.bm do |b|
|
44
|
+
num_records.each do |qty|
|
45
|
+
b.report("#{qty.to_s.rjust(5, " ")} records "){ qty.times{ create_link(false) } }
|
46
|
+
b.report("#{qty.to_s.rjust(5, " ")} records tok"){ qty.times{ create_link } }
|
47
|
+
Link.destroy_all
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Mongoid
|
2
|
+
module Token
|
3
|
+
class Error < StandardError; end
|
4
|
+
|
5
|
+
class CollisionRetriesExceeded < Error
|
6
|
+
def initialize(resource = "unknown resource", attempts = "unspecified")
|
7
|
+
@resource = resource
|
8
|
+
@attempts = attempts
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_s
|
12
|
+
"Failed to generate unique token for #{@resource} after #{@attempts} attempts."
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/mongoid_token.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'mongoid/token/exceptions'
|
2
|
+
|
1
3
|
module Mongoid
|
2
4
|
module Token
|
3
5
|
extend ActiveSupport::Concern
|
@@ -6,9 +8,13 @@ module Mongoid
|
|
6
8
|
def token(*args)
|
7
9
|
options = args.extract_options!
|
8
10
|
options[:length] ||= 4
|
11
|
+
options[:retry] ||= 3
|
9
12
|
options[:contains] ||= :alphanumeric
|
13
|
+
options[:field_name] ||= :token
|
10
14
|
|
11
|
-
self.field :
|
15
|
+
self.field options[:field_name].to_sym, :type => String
|
16
|
+
self.index options[:field_name].to_sym, :unique => true
|
17
|
+
# should validate token presence? Should this be enforced?
|
12
18
|
|
13
19
|
set_callback(:create, :before) do |document|
|
14
20
|
document.create_token(options[:length], options[:contains])
|
@@ -17,41 +23,85 @@ module Mongoid
|
|
17
23
|
set_callback(:save, :before) do |document|
|
18
24
|
document.create_token_if_nil(options[:length], options[:contains])
|
19
25
|
end
|
26
|
+
|
27
|
+
after_initialize do # set_callback did not work with after_initialize callback
|
28
|
+
self.instance_variable_set :@max_collision_retries, options[:retry]
|
29
|
+
self.instance_variable_set :@token_field_name, options[:field_name]
|
30
|
+
self.instance_variable_set :@token_length, options[:length]
|
31
|
+
self.instance_variable_set :@token_contains, options[:contains]
|
32
|
+
end
|
33
|
+
|
34
|
+
if options[:retry] > 0
|
35
|
+
alias_method_chain :save, :safety
|
36
|
+
alias_method_chain :save!, :safety
|
37
|
+
end
|
38
|
+
|
39
|
+
self.class_variable_set :@@token_field_name, options[:field_name]
|
20
40
|
end
|
21
41
|
|
22
42
|
def find_by_token(token)
|
23
|
-
self.
|
43
|
+
field_name = self.class_variable_get :@@token_field_name
|
44
|
+
self.first(:conditions => {field_name.to_sym => token})
|
24
45
|
end
|
25
46
|
end
|
26
47
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
end
|
31
|
-
|
32
|
-
protected
|
33
|
-
def create_token(length, characters)
|
34
|
-
self.token = self.generate_token(length, characters) while self.token.nil? || self.class.exists?(:conditions => {:token => self.token})
|
35
|
-
end
|
48
|
+
def to_param
|
49
|
+
self.send(@token_field_name.to_sym)
|
50
|
+
end
|
36
51
|
|
37
|
-
|
38
|
-
|
52
|
+
protected
|
53
|
+
def save_with_safety(args = {}, &block)
|
54
|
+
retries = @max_collision_retries
|
55
|
+
begin
|
56
|
+
# puts "Attempt: #{retries}"
|
57
|
+
safely.save_without_safety(args, &block)
|
58
|
+
rescue Mongo::OperationFailure => e
|
59
|
+
if (retries -= 1) > 0
|
60
|
+
self.create_token(@token_length, @token_contains)
|
61
|
+
retry
|
62
|
+
else
|
63
|
+
Rails.logger.warn "[Mongoid::Token] Warning: Maximum to generation retries (#{@max_collision_retries}) exceeded." if defined?(Rails) && Rails.env == 'development'
|
64
|
+
raise Mongoid::Token::CollisionRetriesExceeded.new(self, @max_collision_retries)
|
65
|
+
end
|
39
66
|
end
|
67
|
+
end
|
40
68
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
Array.new(length).map{['A'..'Z','a'..'z'].map{|r|r.to_a}.flatten[rand(52)]}.join
|
69
|
+
def save_with_safety!(args = {}, &block)
|
70
|
+
retries = @max_collision_retries
|
71
|
+
begin
|
72
|
+
#puts "Attempt: #{retries}"
|
73
|
+
safely.save_without_safety!(args, &block)
|
74
|
+
rescue Mongo::OperationFailure => e
|
75
|
+
if (retries -= 1) > 0
|
76
|
+
self.create_token(@token_length, @token_contains)
|
77
|
+
retry
|
51
78
|
else
|
52
|
-
|
79
|
+
Rails.logger.warn "[Mongoid::Token] Warning: Maximum to generation retries (#{@max_collision_retries}) exceeded." if defined?(Rails) && Rails.env == 'development'
|
80
|
+
raise Mongoid::Token::CollisionRetriesExceeded.new(self, @max_collision_retries)
|
53
81
|
end
|
54
82
|
end
|
55
83
|
end
|
84
|
+
|
85
|
+
def create_token(length, characters)
|
86
|
+
self.send(:"#{@token_field_name}=", self.generate_token(length, characters))
|
87
|
+
#puts "Set #{@token_field_name.to_s} to #{self.send(@token_field_name.to_sym)}"
|
88
|
+
end
|
89
|
+
|
90
|
+
def create_token_if_nil(length, characters)
|
91
|
+
self.create_token(length, characters) if self[@token_field_name.to_sym].nil?
|
92
|
+
end
|
93
|
+
|
94
|
+
def generate_token(length, characters = :alphanumeric)
|
95
|
+
case characters
|
96
|
+
when :alphanumeric
|
97
|
+
(1..length).collect { (i = Kernel.rand(62); i += ((i < 10) ? 48 : ((i < 36) ? 55 : 61 ))).chr }.join
|
98
|
+
when :numeric
|
99
|
+
rand(10**length).to_s
|
100
|
+
when :fixed_numeric
|
101
|
+
rand(10**length).to_s.rjust(length,rand(10).to_s)
|
102
|
+
when :alpha
|
103
|
+
Array.new(length).map{['A'..'Z','a'..'z'].map{|r|r.to_a}.flatten[rand(52)]}.join
|
104
|
+
end
|
105
|
+
end
|
56
106
|
end
|
57
107
|
end
|
data/lib/version.rb
CHANGED
data/mongoid_token.gemspec
CHANGED
@@ -10,10 +10,10 @@ Gem::Specification.new do |s|
|
|
10
10
|
s.email = ["nicholas@bruning.com.au"]
|
11
11
|
s.homepage = "http://github.com/thetron/mongoid_token"
|
12
12
|
s.summary = %q{A little random, unique token generator for Mongoid documents.}
|
13
|
-
s.description = %q{Mongoid token is a gem for creating random, unique tokens for mongoid documents
|
13
|
+
s.description = %q{Mongoid token is a gem for creating random, unique tokens for mongoid documents. Highly configurable and great for making URLs a little more compact.}
|
14
14
|
|
15
15
|
s.rubyforge_project = "mongoid_token"
|
16
|
-
s.add_dependency 'activesupport', '>= 3.0
|
16
|
+
s.add_dependency 'activesupport', '>= 3.0'
|
17
17
|
|
18
18
|
s.files = `git ls-files`.split("\n")
|
19
19
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
data/spec/mongoid/token_spec.rb
CHANGED
@@ -22,12 +22,37 @@ class Link
|
|
22
22
|
token :length => 3, :contains => :alphanumeric
|
23
23
|
end
|
24
24
|
|
25
|
+
class FailLink
|
26
|
+
include Mongoid::Document
|
27
|
+
include Mongoid::Token
|
28
|
+
field :url
|
29
|
+
token :length => 3, :contains => :alphanumeric, :retry => 0
|
30
|
+
end
|
31
|
+
|
25
32
|
class Video
|
26
33
|
include Mongoid::Document
|
27
34
|
include Mongoid::Token
|
28
35
|
|
29
36
|
field :name
|
30
|
-
token :length => 8, :contains => :alpha
|
37
|
+
token :length => 8, :contains => :alpha, :field_name => :vid
|
38
|
+
end
|
39
|
+
|
40
|
+
class Node
|
41
|
+
include Mongoid::Document
|
42
|
+
include Mongoid::Token
|
43
|
+
|
44
|
+
field :name
|
45
|
+
token :length => 8, :contains => :fixed_numeric
|
46
|
+
|
47
|
+
embedded_in :cluster
|
48
|
+
end
|
49
|
+
|
50
|
+
class Cluster
|
51
|
+
include Mongoid::Document
|
52
|
+
|
53
|
+
field :name
|
54
|
+
|
55
|
+
embeds_many :nodes
|
31
56
|
end
|
32
57
|
|
33
58
|
describe Mongoid::Token do
|
@@ -35,21 +60,28 @@ describe Mongoid::Token do
|
|
35
60
|
@account = Account.create(:name => "Involved Pty. Ltd.")
|
36
61
|
@link = Link.create(:url => "http://involved.com.au")
|
37
62
|
@video = Video.create(:name => "Nyan nyan")
|
63
|
+
|
64
|
+
Account.create_indexes
|
65
|
+
Link.create_indexes
|
66
|
+
FailLink.create_indexes
|
67
|
+
Video.create_indexes
|
68
|
+
Node.create_indexes
|
38
69
|
end
|
39
70
|
|
40
71
|
it "should have a token field" do
|
41
72
|
@account.attributes.include?('token').should == true
|
42
73
|
@link.attributes.include?('token').should == true
|
43
|
-
@video.attributes.include?('
|
74
|
+
@video.attributes.include?('vid').should == true
|
44
75
|
end
|
45
76
|
|
46
77
|
it "should have a token of correct length" do
|
47
78
|
@account.token.length.should == 16
|
48
79
|
@link.token.length.should == 3
|
49
|
-
@video.
|
80
|
+
@video.vid.length.should == 8
|
50
81
|
end
|
51
82
|
|
52
83
|
it "should only generate unique tokens" do
|
84
|
+
Link.create_indexes
|
53
85
|
1000.times do
|
54
86
|
@link = Link.create(:url => "http://involved.com.au")
|
55
87
|
Link.count(:conditions => {:token => @link.token}).should == 1
|
@@ -70,9 +102,9 @@ describe Mongoid::Token do
|
|
70
102
|
@link.token.gsub(/[A-Za-z0-9]/, "").length.should == 0
|
71
103
|
end
|
72
104
|
|
73
|
-
50.times do
|
105
|
+
50.times do |index|
|
74
106
|
@video = Video.create(:name => "A test video")
|
75
|
-
@video.
|
107
|
+
@video.vid.gsub(/[A-Za-z]/, "").length.should == 0
|
76
108
|
end
|
77
109
|
end
|
78
110
|
|
@@ -89,16 +121,22 @@ describe Mongoid::Token do
|
|
89
121
|
it "should return the token as its parameter" do
|
90
122
|
@account.to_param.should == @account.token
|
91
123
|
@link.to_param.should == @link.token
|
92
|
-
@video.to_param.should == @video.
|
124
|
+
@video.to_param.should == @video.vid
|
93
125
|
end
|
94
126
|
|
95
127
|
|
96
|
-
it "should be
|
128
|
+
it "should be findable by token" do
|
97
129
|
50.times do |index|
|
98
130
|
Account.create(:name => "A random company #{index}")
|
99
131
|
end
|
100
132
|
Account.find_by_token(@account.token).id.should == @account.id
|
101
133
|
Account.find_by_token(Account.last.token).id.should == Account.last.id
|
134
|
+
|
135
|
+
10.times do |index|
|
136
|
+
Video.create(:name => "Lord of the Rings, Super Special Edition part #{index}")
|
137
|
+
end
|
138
|
+
Video.find_by_token(@video.vid).id.should == @video.id
|
139
|
+
Video.find_by_token(Video.last.vid).id.should == Video.last.id
|
102
140
|
end
|
103
141
|
|
104
142
|
it "should create a token, if the token is missing" do
|
@@ -106,4 +144,46 @@ describe Mongoid::Token do
|
|
106
144
|
@account.save!
|
107
145
|
@account.token.should_not be_nil
|
108
146
|
end
|
147
|
+
|
148
|
+
it "should fail with an exception after 3 retries (by default)" do
|
149
|
+
Link.destroy_all
|
150
|
+
Link.create_indexes
|
151
|
+
|
152
|
+
@first_link = Link.create(:url => "http://involved.com.au")
|
153
|
+
@link = Link.new(:url => "http://fail.com")
|
154
|
+
def @link.create_token(l,c) # override to always generate a duplicate
|
155
|
+
super
|
156
|
+
self.token = Link.first.token
|
157
|
+
end
|
158
|
+
|
159
|
+
lambda{ @link.save }.should raise_error(Mongoid::Token::CollisionRetriesExceeded)
|
160
|
+
Link.count.should == 1
|
161
|
+
Link.where(:token => @first_link.token).count.should == 1
|
162
|
+
end
|
163
|
+
|
164
|
+
it "should not raise a custom exception if retries are set to zero" do
|
165
|
+
FailLink.destroy_all
|
166
|
+
FailLink.create_indexes
|
167
|
+
|
168
|
+
@first_link = FailLink.create(:url => "http://involved.com.au")
|
169
|
+
@link = FailLink.new(:url => "http://fail.com")
|
170
|
+
def @link.create_token(l,c) # override to always generate a duplicate
|
171
|
+
super
|
172
|
+
self.token = FailLink.first.token
|
173
|
+
end
|
174
|
+
|
175
|
+
lambda{ @link.save }.should_not raise_error(Mongoid::Token::CollisionRetriesExceeded)
|
176
|
+
end
|
177
|
+
|
178
|
+
it "should create unique indexes on embedded documents" do
|
179
|
+
@cluster = Cluster.new(:name => "CLUSTER_001")
|
180
|
+
5.times do |index|
|
181
|
+
@cluster.nodes.create!(:name => "NODE_#{index.to_s.rjust(3, '0')}")
|
182
|
+
end
|
183
|
+
|
184
|
+
@cluster.nodes.each do |node|
|
185
|
+
node.attributes.include?('token').should == true
|
186
|
+
node.token.match(/[0-9]{8}/).should_not == nil
|
187
|
+
end
|
188
|
+
end
|
109
189
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -4,6 +4,7 @@ require 'database_cleaner'
|
|
4
4
|
require 'mongoid'
|
5
5
|
require 'mongoid-rspec'
|
6
6
|
require 'mongoid_token'
|
7
|
+
require 'mongoid/token/exceptions'
|
7
8
|
|
8
9
|
RSpec.configure do |config|
|
9
10
|
config.include Mongoid::Matchers
|
@@ -13,10 +14,18 @@ RSpec.configure do |config|
|
|
13
14
|
|
14
15
|
config.after(:each) do
|
15
16
|
DatabaseCleaner.clean
|
17
|
+
|
18
|
+
# Added dropping collection to ensure indexes are removed
|
19
|
+
Mongoid.master.collections.select do |collection|
|
20
|
+
include = collection.name !~ /system/
|
21
|
+
include
|
22
|
+
end.each(&:drop)
|
16
23
|
end
|
17
24
|
end
|
18
25
|
|
19
26
|
Mongoid.configure do |config|
|
20
27
|
config.master = Mongo::Connection.new.db("mongoid_token_test")
|
28
|
+
config.autocreate_indexes = true
|
29
|
+
config.persist_in_safe_mode = true
|
21
30
|
end
|
22
31
|
|
metadata
CHANGED
@@ -1,78 +1,72 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongoid_token
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
4
5
|
prerelease:
|
5
|
-
version: 0.9.1
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Nicholas Bruning
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-02-08 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
16
15
|
name: activesupport
|
17
|
-
|
18
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &2162530960 !ruby/object:Gem::Requirement
|
19
17
|
none: false
|
20
|
-
requirements:
|
21
|
-
- -
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 3.0
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '3.0'
|
24
22
|
type: :runtime
|
25
|
-
|
26
|
-
|
27
|
-
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *2162530960
|
25
|
+
description: Mongoid token is a gem for creating random, unique tokens for mongoid
|
26
|
+
documents. Highly configurable and great for making URLs a little more compact.
|
27
|
+
email:
|
28
28
|
- nicholas@bruning.com.au
|
29
29
|
executables: []
|
30
|
-
|
31
30
|
extensions: []
|
32
|
-
|
33
31
|
extra_rdoc_files: []
|
34
|
-
|
35
|
-
files:
|
32
|
+
files:
|
36
33
|
- .autotest
|
37
34
|
- .gitignore
|
38
35
|
- .rspec
|
39
36
|
- Gemfile
|
40
37
|
- README.md
|
41
38
|
- Rakefile
|
42
|
-
-
|
39
|
+
- benchmarks/benchmark.rb
|
40
|
+
- lib/mongoid/token/exceptions.rb
|
43
41
|
- lib/mongoid_token.rb
|
44
42
|
- lib/version.rb
|
45
43
|
- mongoid_token.gemspec
|
46
|
-
- spec/.DS_Store
|
47
44
|
- spec/mongoid/token_spec.rb
|
48
45
|
- spec/spec_helper.rb
|
49
46
|
homepage: http://github.com/thetron/mongoid_token
|
50
47
|
licenses: []
|
51
|
-
|
52
48
|
post_install_message:
|
53
49
|
rdoc_options: []
|
54
|
-
|
55
|
-
require_paths:
|
50
|
+
require_paths:
|
56
51
|
- lib
|
57
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
52
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
58
53
|
none: false
|
59
|
-
requirements:
|
60
|
-
- -
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
version:
|
63
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - ! '>='
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '0'
|
58
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
59
|
none: false
|
65
|
-
requirements:
|
66
|
-
- -
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version:
|
60
|
+
requirements:
|
61
|
+
- - ! '>='
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
69
64
|
requirements: []
|
70
|
-
|
71
65
|
rubyforge_project: mongoid_token
|
72
|
-
rubygems_version: 1.8.
|
66
|
+
rubygems_version: 1.8.7
|
73
67
|
signing_key:
|
74
68
|
specification_version: 3
|
75
69
|
summary: A little random, unique token generator for Mongoid documents.
|
76
|
-
test_files:
|
70
|
+
test_files:
|
77
71
|
- spec/mongoid/token_spec.rb
|
78
72
|
- spec/spec_helper.rb
|
data/lib/.DS_Store
DELETED
Binary file
|
data/spec/.DS_Store
DELETED
Binary file
|