mongoid_slug 3.1.2 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/mongoid/slug.rb +15 -3
- data/lib/mongoid/slug/criteria.rb +10 -8
- data/lib/mongoid/slug/version.rb +1 -1
- data/spec/models/page_slug_localized_custom.rb +11 -0
- data/spec/mongoid/criteria_spec.rb +1 -1
- data/spec/mongoid/slug_spec.rb +29 -34
- data/spec/shared/indexes.rb +27 -0
- data/spec/spec_helper.rb +3 -1
- metadata +11 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cb9aaa8ca267d57f8a6b9a301cc904096c5b511a
|
4
|
+
data.tar.gz: 4ab3f142f2fcb037d5e9b1e0c61b66ea44d8d770
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4432bce036538231bbf2b60704b192f6b600f1129400aa804093226369e01df038a215c7af1a058192b663ed9fcbb046285793040483c3882102a98d6fcacbdf
|
7
|
+
data.tar.gz: ae81c2411c4c53542ac761048dac229e2eb6016f11dae322e20b7060dbf575155cbed2d5874c4c1931fbe9cca878dfb63524a1ea884f782d44f7f5d95d5dcd49
|
data/README.md
CHANGED
@@ -257,7 +257,7 @@ Custom Find Strategies
|
|
257
257
|
--------------
|
258
258
|
|
259
259
|
By default find will search for the document by the id field if the provided id
|
260
|
-
looks like a BSON
|
260
|
+
looks like a BSON::ObjectId, and it will otherwise find by the _slugs field. However,
|
261
261
|
custom strategies can ovveride the default behavior, like e.g:
|
262
262
|
|
263
263
|
```ruby
|
data/lib/mongoid/slug.rb
CHANGED
@@ -133,8 +133,6 @@ module Mongoid
|
|
133
133
|
if localized?
|
134
134
|
begin
|
135
135
|
orig_locale = I18n.locale
|
136
|
-
all_locales = self.slugged_attributes
|
137
|
-
.map{|attr| self.send("#{attr}_translations").keys}.flatten.uniq
|
138
136
|
all_locales.each do |target_locale|
|
139
137
|
I18n.locale = target_locale
|
140
138
|
set_slug
|
@@ -206,7 +204,9 @@ module Mongoid
|
|
206
204
|
_cur_slug || pre_slug_string
|
207
205
|
end
|
208
206
|
|
209
|
-
|
207
|
+
def self.mongoid3?
|
208
|
+
::Mongoid.const_defined? :Observer
|
209
|
+
end
|
210
210
|
|
211
211
|
private
|
212
212
|
|
@@ -253,6 +253,18 @@ module Mongoid
|
|
253
253
|
self.fields['_slugs'].options[:localize] rescue false
|
254
254
|
end
|
255
255
|
|
256
|
+
# Return all possible locales for model
|
257
|
+
# Avoiding usage of I18n.available_locales in case the user hasn't set it properly, or is
|
258
|
+
# doing something crazy, but at the same time we need a fallback in case the model doesn't
|
259
|
+
# have any localized attributes at all (extreme edge case).
|
260
|
+
def all_locales
|
261
|
+
locales = self.slugged_attributes
|
262
|
+
.map{|attr| self.send("#{attr}_translations").keys if self.respond_to?("#{attr}_translations")}
|
263
|
+
.flatten.compact.uniq
|
264
|
+
locales = I18n.available_locales if locales.empty?
|
265
|
+
locales
|
266
|
+
end
|
267
|
+
|
256
268
|
def pre_slug_string
|
257
269
|
self.slugged_attributes.map { |f| self.send f }.join ' '
|
258
270
|
end
|
@@ -1,12 +1,10 @@
|
|
1
|
-
# require 'moped/bson/object_id'
|
2
|
-
|
3
1
|
module Mongoid
|
4
2
|
module Slug
|
5
3
|
class Criteria < Mongoid::Criteria
|
6
4
|
# Find the matchind document(s) in the criteria for the provided ids or slugs.
|
7
5
|
#
|
8
|
-
# If the document _ids are of the type
|
9
|
-
# convertible to
|
6
|
+
# If the document _ids are of the type BSON::ObjectId, and all the supplied parameters are
|
7
|
+
# convertible to BSON::ObjectId (via BSON::ObjectId#from_string), finding will be
|
10
8
|
# performed via _ids.
|
11
9
|
#
|
12
10
|
# If the document has any other type of _id field, and all the supplied parameters are of the same
|
@@ -15,10 +13,10 @@ module Mongoid
|
|
15
13
|
# Otherwise finding will be performed via slugs.
|
16
14
|
#
|
17
15
|
# @example Find by an id.
|
18
|
-
# criteria.find(
|
16
|
+
# criteria.find(BSON::ObjectId.new)
|
19
17
|
#
|
20
18
|
# @example Find by multiple ids.
|
21
|
-
# criteria.find([
|
19
|
+
# criteria.find([ BSON::ObjectId.new, BSON::ObjectId.new ])
|
22
20
|
#
|
23
21
|
# @example Find by a slug.
|
24
22
|
# criteria.find('some-slug')
|
@@ -67,9 +65,13 @@ module Mongoid
|
|
67
65
|
self.respond_to?(type_method, true) ? method(type_method) : lambda {|id| false}
|
68
66
|
end
|
69
67
|
|
70
|
-
# a string will not look like a slug if it looks like a legal ObjectId
|
68
|
+
# a string will not look like a slug if it looks like a legal BSON::ObjectId
|
71
69
|
def objectid_slug_strategy id
|
72
|
-
|
70
|
+
if Mongoid::Slug.mongoid3?
|
71
|
+
Moped::BSON::ObjectId.legal? id
|
72
|
+
else
|
73
|
+
BSON::ObjectId.legal?(id)
|
74
|
+
end
|
73
75
|
end
|
74
76
|
|
75
77
|
# a string will always look like a slug
|
data/lib/mongoid/slug/version.rb
CHANGED
data/spec/mongoid/slug_spec.rb
CHANGED
@@ -101,8 +101,8 @@ module Mongoid
|
|
101
101
|
}
|
102
102
|
end
|
103
103
|
|
104
|
-
it "does not allow a
|
105
|
-
bson_id = Moped::BSON::ObjectId.new.to_s
|
104
|
+
it "does not allow a BSON::ObjectId as use for a slug" do
|
105
|
+
bson_id = Mongoid::Slug.mongoid3? ? Moped::BSON::ObjectId.new.to_s : BSON::ObjectId.new.to_s
|
106
106
|
bad = Book.create(:title => bson_id)
|
107
107
|
bad.slugs.should_not include(bson_id)
|
108
108
|
end
|
@@ -127,11 +127,11 @@ module Mongoid
|
|
127
127
|
Book.find([book.id.to_s]).should eql [book]
|
128
128
|
end
|
129
129
|
|
130
|
-
it "finds by id as
|
130
|
+
it "finds by id as BSON::ObjectId" do
|
131
131
|
Book.find(book.id).should eql book
|
132
132
|
end
|
133
133
|
|
134
|
-
it "finds by id as an array of
|
134
|
+
it "finds by id as an array of BSON::ObjectIds" do
|
135
135
|
Book.find([book.id]).should eql [book]
|
136
136
|
end
|
137
137
|
|
@@ -161,7 +161,7 @@ module Mongoid
|
|
161
161
|
dup.to_param.should eql "psychoanalysis-1"
|
162
162
|
end
|
163
163
|
|
164
|
-
it "does not allow a
|
164
|
+
it "does not allow a BSON::ObjectId as use for a slug" do
|
165
165
|
bad = book.subjects.create(:name => "4ea0389f0364313d79104fb3")
|
166
166
|
bad.slugs.should_not eql "4ea0389f0364313d79104fb3"
|
167
167
|
end
|
@@ -185,11 +185,11 @@ module Mongoid
|
|
185
185
|
book.subjects.find([subject.id.to_s]).should eql [subject]
|
186
186
|
end
|
187
187
|
|
188
|
-
it "finds by id as
|
188
|
+
it "finds by id as BSON::ObjectId" do
|
189
189
|
book.subjects.find(subject.id).should eql subject
|
190
190
|
end
|
191
191
|
|
192
|
-
it "finds by id as an array of
|
192
|
+
it "finds by id as an array of BSON::ObjectIds" do
|
193
193
|
book.subjects.find([subject.id]).should eql [subject]
|
194
194
|
end
|
195
195
|
|
@@ -228,7 +228,7 @@ module Mongoid
|
|
228
228
|
dup.to_param.should eql "jane-smith-1"
|
229
229
|
end
|
230
230
|
|
231
|
-
it "does not allow a
|
231
|
+
it "does not allow a BSON::ObjectId as use for a slug" do
|
232
232
|
bad = relationship.partners.create(:name => "4ea0389f0364313d79104fb3")
|
233
233
|
bad.slugs.should_not eql "4ea0389f0364313d79104fb3"
|
234
234
|
end
|
@@ -258,11 +258,11 @@ module Mongoid
|
|
258
258
|
relationship.partners.find([partner.id.to_s]).should eql [partner]
|
259
259
|
end
|
260
260
|
|
261
|
-
it "finds by id as
|
261
|
+
it "finds by id as BSON::ObjectId" do
|
262
262
|
relationship.partners.find(partner.id).should eql partner
|
263
263
|
end
|
264
264
|
|
265
|
-
it "finds by id as an array of
|
265
|
+
it "finds by id as an array of BSON::ObjectIds" do
|
266
266
|
relationship.partners.find([partner.id]).should eql [partner]
|
267
267
|
end
|
268
268
|
|
@@ -305,7 +305,7 @@ module Mongoid
|
|
305
305
|
dup2.to_param.should eql "gilles-deleuze-2"
|
306
306
|
end
|
307
307
|
|
308
|
-
it "does not allow a
|
308
|
+
it "does not allow a BSON::ObjectId as use for a slug" do
|
309
309
|
bad = Author.create(:first_name => "4ea0389f0364",
|
310
310
|
:last_name => "313d79104fb3")
|
311
311
|
bad.to_param.should_not eql "4ea0389f0364313d79104fb3"
|
@@ -372,7 +372,7 @@ module Mongoid
|
|
372
372
|
dup.to_param.should eql "book-title-1"
|
373
373
|
end
|
374
374
|
|
375
|
-
it "does not allow a
|
375
|
+
it "does not allow a BSON::ObjectId as use for a slug" do
|
376
376
|
bad = Book.create(:title => "4ea0389f0364313d79104fb3")
|
377
377
|
bad.to_param.should_not eql "4ea0389f0364313d79104fb3"
|
378
378
|
end
|
@@ -405,7 +405,7 @@ module Mongoid
|
|
405
405
|
dup.to_param.should eql "gilles-deleuze-1"
|
406
406
|
end
|
407
407
|
|
408
|
-
it "does not allow a
|
408
|
+
it "does not allow a BSON::ObjectId as use for a slug" do
|
409
409
|
bad = book.authors.create(:first_name => "4ea0389f0364",
|
410
410
|
:last_name => "313d79104fb3")
|
411
411
|
bad.to_param.should_not eql "4ea0389f0364313d79104fb3"
|
@@ -447,7 +447,7 @@ module Mongoid
|
|
447
447
|
dup.to_param.should eql "big-weekly-1"
|
448
448
|
end
|
449
449
|
|
450
|
-
it "does not allow a
|
450
|
+
it "does not allow a BSON::ObjectId as use for a slug" do
|
451
451
|
bad = Magazine.create(:title => "4ea0389f0364313d79104fb3", :publisher_id => "abc123")
|
452
452
|
bad.to_param.should_not eql "4ea0389f0364313d79104fb3"
|
453
453
|
end
|
@@ -522,36 +522,24 @@ module Mongoid
|
|
522
522
|
end
|
523
523
|
|
524
524
|
context "when slug is not scoped by a reference association" do
|
525
|
-
|
526
|
-
|
527
|
-
end
|
528
|
-
|
529
|
-
it "defines a unique index" do
|
530
|
-
Book.index_options[ :_slugs => 1 ][:unique].should be_true
|
531
|
-
end
|
525
|
+
subject { Book }
|
526
|
+
it_should_behave_like "has an index", { _slugs: 1 }, { unique: true }
|
532
527
|
end
|
533
528
|
|
534
529
|
context "when slug is scoped by a reference association" do
|
535
|
-
|
536
|
-
|
537
|
-
end
|
530
|
+
subject { Author }
|
531
|
+
it_should_behave_like "does not have an index", { _slugs: 1 }
|
538
532
|
end
|
539
533
|
|
540
534
|
context "for subclass scope" do
|
541
535
|
context "when slug is not scoped by a reference association" do
|
542
|
-
|
543
|
-
|
544
|
-
end
|
545
|
-
|
546
|
-
it "defines a unique index" do
|
547
|
-
BookPolymorphic.index_options[ :_type => 1, :_slugs => 1 ][:unique].should_not be_true
|
548
|
-
end
|
536
|
+
subject { BookPolymorphic }
|
537
|
+
it_should_behave_like "has an index", { _type: 1, _slugs: 1 }, { unique: nil }
|
549
538
|
end
|
550
539
|
|
551
540
|
context "when slug is scoped by a reference association" do
|
552
|
-
|
553
|
-
|
554
|
-
end
|
541
|
+
subject { AuthorPolymorphic }
|
542
|
+
it_should_behave_like "does not have an index", { _type: 1, _slugs: 1 }
|
555
543
|
end
|
556
544
|
|
557
545
|
context "when the object has STI" do
|
@@ -879,6 +867,13 @@ module Mongoid
|
|
879
867
|
page["_slugs"].should == {"en" => ["modified-title-on-english"],
|
880
868
|
"nl" => ["title-on-netherlands"]}
|
881
869
|
end
|
870
|
+
|
871
|
+
it "works with a custom slug strategy" do
|
872
|
+
page = PageSlugLocalizedCustom.new
|
873
|
+
page.title = "a title for the slug"
|
874
|
+
page.save
|
875
|
+
page["_slugs"].should == {"en" => ["a-title-for-the-slug"]}
|
876
|
+
end
|
882
877
|
end
|
883
878
|
|
884
879
|
context "slug can be localized when using history" do
|
@@ -0,0 +1,27 @@
|
|
1
|
+
shared_examples "has an index" do |key, options|
|
2
|
+
it "has a #{key} index" do
|
3
|
+
index = if Mongoid::Slug.mongoid3?
|
4
|
+
subject.index_options[key]
|
5
|
+
else
|
6
|
+
subject.index_specifications.detect { |spec| spec.key == key }
|
7
|
+
end
|
8
|
+
index.should_not be_nil
|
9
|
+
options.each_pair { |name, value|
|
10
|
+
if Mongoid::Slug.mongoid3?
|
11
|
+
index[name].should == value
|
12
|
+
else
|
13
|
+
index.options[name].should == value
|
14
|
+
end
|
15
|
+
} if options
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
shared_examples "does not have an index" do |key, option|
|
20
|
+
it "does not have the #{key} index" do
|
21
|
+
if Mongoid::Slug.mongoid3?
|
22
|
+
subject.index_options[key].should be_nil
|
23
|
+
else
|
24
|
+
subject.index_specifications.detect { |spec| spec.key == key }.should be_nil
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -23,7 +23,9 @@ Mongoid.configure do |config|
|
|
23
23
|
config.connect_to database_id
|
24
24
|
end
|
25
25
|
|
26
|
-
|
26
|
+
[ 'models', 'shared' ].each do |dir|
|
27
|
+
Dir["./spec/#{dir}/*.rb"].each { |f| require f }
|
28
|
+
end
|
27
29
|
|
28
30
|
RSpec.configure do |c|
|
29
31
|
c.before(:each) do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongoid_slug
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andreas Saebjoernsen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-11-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mongoid
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ~>
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '2.0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ~>
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '2.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: guard-rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -152,6 +152,7 @@ files:
|
|
152
152
|
- spec/models/page.rb
|
153
153
|
- spec/models/page_localize.rb
|
154
154
|
- spec/models/page_slug_localized.rb
|
155
|
+
- spec/models/page_slug_localized_custom.rb
|
155
156
|
- spec/models/page_slug_localized_history.rb
|
156
157
|
- spec/models/paranoid_document.rb
|
157
158
|
- spec/models/partner.rb
|
@@ -163,9 +164,11 @@ files:
|
|
163
164
|
- spec/mongoid/criteria_spec.rb
|
164
165
|
- spec/mongoid/slug_spec.rb
|
165
166
|
- spec/mongoid/slug_spec.rb.b00
|
167
|
+
- spec/shared/indexes.rb
|
166
168
|
- spec/spec_helper.rb
|
167
169
|
homepage: https://github.com/digitalplaywright/mongoid-slug
|
168
|
-
licenses:
|
170
|
+
licenses:
|
171
|
+
- MIT
|
169
172
|
metadata: {}
|
170
173
|
post_install_message:
|
171
174
|
rdoc_options: []
|
@@ -183,7 +186,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
183
186
|
version: '0'
|
184
187
|
requirements: []
|
185
188
|
rubyforge_project: mongoid_slug
|
186
|
-
rubygems_version: 2.
|
189
|
+
rubygems_version: 2.1.10
|
187
190
|
signing_key:
|
188
191
|
specification_version: 4
|
189
192
|
summary: Mongoid URL slugs
|
@@ -203,6 +206,7 @@ test_files:
|
|
203
206
|
- spec/models/page.rb
|
204
207
|
- spec/models/page_localize.rb
|
205
208
|
- spec/models/page_slug_localized.rb
|
209
|
+
- spec/models/page_slug_localized_custom.rb
|
206
210
|
- spec/models/page_slug_localized_history.rb
|
207
211
|
- spec/models/paranoid_document.rb
|
208
212
|
- spec/models/partner.rb
|
@@ -214,5 +218,5 @@ test_files:
|
|
214
218
|
- spec/mongoid/criteria_spec.rb
|
215
219
|
- spec/mongoid/slug_spec.rb
|
216
220
|
- spec/mongoid/slug_spec.rb.b00
|
221
|
+
- spec/shared/indexes.rb
|
217
222
|
- spec/spec_helper.rb
|
218
|
-
has_rdoc:
|