mongoid-slug 5.3.3 → 6.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: d2eeaa1874b33c4764d7e493c7add3bb0da802be
4
- data.tar.gz: d86e661864188f01289726e3bf4ec04a3494e36f
2
+ SHA256:
3
+ metadata.gz: cf9ad642da6118dcc879edd3c4b6f43adf2b110e422d691926984ffb743f0dcf
4
+ data.tar.gz: 800d4c721c01fb89267218aaeff2c5a8d91a906f8587c87aa3680d774011180b
5
5
  SHA512:
6
- metadata.gz: 1261be7d5ff0e72b1faeda6f8e8d5aa82289dfb14e65d43df4c0ca638d16351bcd172b3b0d92e0fa1891c498503c7a82368cd72d4177cca028ef16e12c27ca89
7
- data.tar.gz: f2cad018dec3eb468121f9dd3c810502e466c688105d2f274c71285ca0dcf13b578cb293f45f249595abcec4e14aafd4cce17f5814e127566b5155cf65544301
6
+ metadata.gz: 8bb6300dd08988c87f922e5cfc308de3ea428a8730a75d9b2c261814cb1a8568ad266b94e8358d710602af131166dbf063ad1e163eca2a2d31108be7d147456d
7
+ data.tar.gz: 36dd52ca7e37b0e57cd4241ab616a20892688dfb4e79af8e02ada7f7802c30b158bb28b5594337eded30c47de948e20e1e40da69bc84ef2398e463d738c63188
data/README.md CHANGED
@@ -325,30 +325,6 @@ unique = Mongoid::Slug::UniqueSlug.new(Book.new).find_unique(title)
325
325
  # return some representation of unique
326
326
  ```
327
327
 
328
- ### Mongoid::Paranoia Support
329
-
330
- The [Mongoid::Paranoia](http://github.com/simi/mongoid-paranoia) gem adds "soft-destroy" functionality to Mongoid documents.
331
-
332
- Mongoid::Slug contains special handling for Mongoid::Paranoia:
333
-
334
- * When destroying a paranoid document, the slug will be unset from the database.
335
- * When restoring a paranoid document, the slug will be rebuilt. Note that the new slug may not match the old one.
336
- * When resaving a destroyed paranoid document, the slug will remain unset in the database.
337
- * For indexing purposes, sparse unique indexes are used. The sparse condition will ignore any destroyed paranoid documents, since their slug is not set in database.
338
-
339
- ```ruby
340
- class Entity
341
- include Mongoid::Document
342
- include Mongoid::Slug
343
- include Mongoid::Paranoia
344
- end
345
- ```
346
-
347
- The following variants of Mongoid Paranoia are officially supported:
348
-
349
- * Mongoid 3 built-in `Mongoid::Paranoia`
350
- * Mongoid 4 or 5 gem http://github.com/simi/mongoid_paranoia
351
-
352
328
  Contributing
353
329
  ------------
354
330
 
@@ -357,4 +333,4 @@ Mongoid-slug is work of [many of contributors](https://github.com/mongoid/mongoi
357
333
  Copyright & License
358
334
  -------------------
359
335
 
360
- Copyright (c) 2010-2016 Hakan Ensari & Contributors, see [LICENSE](LICENSE) for details.
336
+ Copyright (c) 2010-2017 Hakan Ensari & Contributors, see [LICENSE](LICENSE) for details.
@@ -2,7 +2,6 @@ require 'mongoid'
2
2
  require 'stringex'
3
3
  require 'mongoid/slug/criteria'
4
4
  require 'mongoid/slug/index'
5
- require 'mongoid/slug/paranoia'
6
5
  require 'mongoid/slug/unique_slug'
7
6
  require 'mongoid/slug/slug_id_strategy'
8
7
  require 'mongoid-compatibility'
@@ -76,7 +75,7 @@ module Mongoid
76
75
  options = fields.extract_options!
77
76
 
78
77
  self.slug_scope = options[:scope]
79
- self.slug_reserved_words = options[:reserve] || Set.new(%w(new edit))
78
+ self.slug_reserved_words = options[:reserve] || Set.new(%w[new edit])
80
79
  self.slugged_attributes = fields.map(&:to_s)
81
80
  self.slug_history = options[:history]
82
81
  self.slug_by_model_type = options[:by_model_type]
@@ -86,9 +85,7 @@ module Mongoid
86
85
  alias_attribute :slugs, :_slugs
87
86
 
88
87
  # Set index
89
- unless embedded?
90
- index(*Mongoid::Slug::Index.build_index(slug_scope_key, slug_by_model_type))
91
- end
88
+ index(*Mongoid::Slug::Index.build_index(slug_scope_key, slug_by_model_type)) unless embedded?
92
89
 
93
90
  self.slug_url_builder = block_given? ? block : default_slug_url_builder
94
91
 
@@ -99,19 +96,6 @@ module Mongoid
99
96
  else
100
97
  set_callback :save, :before, :build_slug, if: :slug_should_be_rebuilt?
101
98
  end
102
-
103
- # If paranoid document:
104
- # - include shim to add callbacks for restore method
105
- # - unset the slugs on destroy
106
- # - recreate the slug on restore
107
- # - force reset the slug when saving a destroyed paranoid document, to ensure it stays unset in the database
108
- if is_paranoid_doc?
109
- send(:include, Mongoid::Slug::Paranoia) unless respond_to?(:before_restore)
110
- set_callback :destroy, :after, :unset_slug!
111
- set_callback :restore, :before, :set_slug!
112
- set_callback :save, :before, :reset_slug!, if: :paranoid_deleted?
113
- set_callback :save, :after, :clear_slug!, if: :paranoid_deleted?
114
- end
115
99
  end
116
100
 
117
101
  def default_slug_url_builder
@@ -124,7 +108,7 @@ module Mongoid
124
108
 
125
109
  # Returns the scope key for indexing, considering associations
126
110
  #
127
- # @return [ Array<Document>, Document ] Whether the document is paranoid
111
+ # @return [ Array<Document>, Document ]
128
112
  def slug_scope_key
129
113
  return nil unless slug_scope
130
114
  reflect_on_association(slug_scope).try(:key) || slug_scope
@@ -155,26 +139,13 @@ module Mongoid
155
139
  current_scope || Criteria.new(self) # Use Mongoid::Slug::Criteria for slugged documents.
156
140
  end
157
141
 
158
- # Indicates whether or not the document includes Mongoid::Paranoia
159
- #
160
- # This can be replaced with .paranoid? method once the following PRs are merged:
161
- # - https://github.com/simi/mongoid-paranoia/pull/19
162
- # - https://github.com/haihappen/mongoid-paranoia/pull/3
163
- #
164
- # @return [ Array<Document>, Document ] Whether the document is paranoid
165
- def is_paranoid_doc?
166
- !!(defined?(::Mongoid::Paranoia) && self < ::Mongoid::Paranoia)
167
- end
168
-
169
142
  private
170
143
 
171
- if Mongoid::Compatibility::Version.mongoid5? ||
172
- Mongoid::Compatibility::Version.mongoid6? &&
173
- Threaded.method(:current_scope).arity == -1
144
+ if Mongoid::Compatibility::Version.mongoid5_or_newer? && Threaded.method(:current_scope).arity == -1
174
145
  def current_scope
175
146
  Threaded.current_scope(self)
176
147
  end
177
- elsif Mongoid::Compatibility::Version.mongoid5? || Mongoid::Compatibility::Version.mongoid6?
148
+ elsif Mongoid::Compatibility::Version.mongoid5_or_newer?
178
149
  def current_scope
179
150
  Threaded.current_scope
180
151
  end
@@ -223,7 +194,6 @@ module Mongoid
223
194
  end
224
195
 
225
196
  # Builds slug then atomically sets it in the database.
226
- # This is used when working with the Mongoid::Paranoia restore callback.
227
197
  #
228
198
  # This method is adapted to use the :set method variants from both
229
199
  # Mongoid 3 (two args) and Mongoid 4 (hash arg)
@@ -263,15 +233,7 @@ module Mongoid
263
233
 
264
234
  # @return [Boolean] Whether the slug requires to be rebuilt
265
235
  def slug_should_be_rebuilt?
266
- (new_record? || _slugs_changed? || slugged_attributes_changed?) && !paranoid_deleted?
267
- end
268
-
269
- # Indicates whether or not the document has been deleted in paranoid fashion
270
- # Always returns false if the document is not paranoid
271
- #
272
- # @return [Boolean] Whether or not the document has been deleted in paranoid fashion
273
- def paranoid_deleted?
274
- !!(self.class.is_paranoid_doc? && !deleted_at.nil?)
236
+ new_record? || _slugs_changed? || slugged_attributes_changed?
275
237
  end
276
238
 
277
239
  def slugged_attributes_changed?
@@ -343,7 +305,7 @@ module Mongoid
343
305
 
344
306
  def localized?
345
307
  fields['_slugs'].options[:localize]
346
- rescue
308
+ rescue StandardError
347
309
  false
348
310
  end
349
311
 
@@ -79,7 +79,7 @@ module Mongoid
79
79
  # _translations
80
80
  localized = (begin
81
81
  @klass.fields['_slugs'].options[:localize]
82
- rescue
82
+ rescue StandardError
83
83
  false
84
84
  end)
85
85
  if localized
@@ -28,12 +28,6 @@ module Mongoid
28
28
  # irrespective of how STI is defined in Mongoid, i.e. ANY child index will be applied to EVERY child.
29
29
  # This can cause collisions using various combinations of scopes.
30
30
  #
31
- # 3) Paranoid docs rely on sparse indexes to exclude paranoid-deleted records
32
- # from the unique index constraint (i.e. when _slugs is unset.) However, when
33
- # using compound keys (`by_model_type` or `scope_key`), paranoid-deleted records
34
- # can become inadvertently indexed when _slugs is unset, causing duplicates. This
35
- # is already covered by #1 and #2 above.
36
- #
37
31
  # In the future, MongoDB may implement partial indexes or improve sparse index behavior.
38
32
  # See: https://jira.mongodb.org/browse/SERVER-785
39
33
  # https://jira.mongodb.org/browse/SERVER-13780
@@ -64,7 +64,8 @@ module Mongoid
64
64
 
65
65
  def_delegators :@model, :slug_scope, :reflect_on_association, :read_attribute,
66
66
  :check_against_id, :slug_reserved_words, :slug_url_builder, :collection_name,
67
- :embedded?, :reflect_on_all_associations, :slug_by_model_type, :slug_max_length
67
+ :embedded?, :reflect_on_all_associations, :reflect_on_all_association,
68
+ :slug_by_model_type, :slug_max_length
68
69
 
69
70
  def initialize(model)
70
71
  @model = model
@@ -73,7 +74,13 @@ module Mongoid
73
74
  end
74
75
 
75
76
  def metadata
76
- @model.respond_to?(:relation_metadata) ? @model.relation_metadata : @model.metadata
77
+ if @model.respond_to?(:_association)
78
+ @model.send(:_association)
79
+ elsif @model.respond_to?(:relation_metadata)
80
+ @model.relation_metadata
81
+ else
82
+ @model.metadata
83
+ end
77
84
  end
78
85
 
79
86
  def find_unique(attempt = nil)
@@ -96,9 +103,7 @@ module Mongoid
96
103
  where_hash[scope] = model.try(:read_attribute, scope)
97
104
  end
98
105
 
99
- if slug_by_model_type
100
- where_hash[:_type] = model.try(:read_attribute, :_type)
101
- end
106
+ where_hash[:_type] = model.try(:read_attribute, :_type) if slug_by_model_type
102
107
 
103
108
  @state = SlugState.new @_slug, uniqueness_scope.unscoped.where(where_hash), escaped_pattern
104
109
 
@@ -150,15 +155,17 @@ module Mongoid
150
155
  end
151
156
 
152
157
  if embedded?
153
- parent_metadata = reflect_on_all_associations(:embedded_in)[0]
158
+ parent_metadata = if Mongoid::Compatibility::Version.mongoid7_or_newer?
159
+ reflect_on_all_association(:embedded_in)[0]
160
+ else
161
+ reflect_on_all_associations(:embedded_in)[0]
162
+ end
154
163
  return model._parent.send(parent_metadata.inverse_of || self.metadata.name)
155
164
  end
156
165
 
157
166
  # unless embedded or slug scope, return the deepest document superclass
158
167
  appropriate_class = model.class
159
- while appropriate_class.superclass.include?(Mongoid::Document)
160
- appropriate_class = appropriate_class.superclass
161
- end
168
+ appropriate_class = appropriate_class.superclass while appropriate_class.superclass.include?(Mongoid::Document)
162
169
  appropriate_class
163
170
  end
164
171
  end
@@ -1,5 +1,5 @@
1
1
  module Mongoid #:nodoc:
2
2
  module Slug
3
- VERSION = '5.3.3'.freeze
3
+ VERSION = '6.0.0'.freeze
4
4
  end
5
5
  end
@@ -3,7 +3,7 @@ class Author
3
3
  include Mongoid::Slug
4
4
  field :first_name
5
5
  field :last_name
6
- if Mongoid::Compatibility::Version.mongoid6?
6
+ if Mongoid::Compatibility::Version.mongoid6_or_newer?
7
7
  belongs_to :book, required: false
8
8
  else
9
9
  belongs_to :book
@@ -4,7 +4,7 @@ class AuthorPolymorphic
4
4
  field :first_name
5
5
  field :last_name
6
6
  slug :first_name, :last_name, scope: :book_polymorphic
7
- if Mongoid::Compatibility::Version.mongoid6?
7
+ if Mongoid::Compatibility::Version.mongoid6_or_newer?
8
8
  belongs_to :book_polymorphic, required: false
9
9
  else
10
10
  belongs_to :book_polymorphic
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  class Entity
3
2
  include Mongoid::Document
4
3
  include Mongoid::Slug
@@ -4,7 +4,7 @@ class Person
4
4
  field :name
5
5
  slug :name, permanent: true, scope: :author
6
6
  embeds_many :relationships
7
- if Mongoid::Compatibility::Version.mongoid6?
7
+ if Mongoid::Compatibility::Version.mongoid6_or_newer?
8
8
  belongs_to :author, inverse_of: :characters, required: false
9
9
  else
10
10
  belongs_to :author, inverse_of: :characters
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  require 'spec_helper'
3
2
 
4
3
  describe Mongoid::Slug::Criteria do
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  require 'spec_helper'
3
2
 
4
3
  describe Mongoid::Slug::Index do
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  require 'spec_helper'
3
2
 
4
3
  module Mongoid
@@ -596,7 +595,7 @@ module Mongoid
596
595
  end
597
596
 
598
597
  context 'with a value exceeding mongodb max index key' do
599
- if Mongoid::Compatibility::Version.mongoid5? || Mongoid::Compatibility::Version.mongoid6?
598
+ if Mongoid::Compatibility::Version.mongoid5_or_newer?
600
599
  it 'errors with a model without a max length' do
601
600
  expect do
602
601
  Book.create!(title: 't' * 1025)
@@ -679,7 +678,7 @@ module Mongoid
679
678
  expect(friend2.slugs).to include('foo-2')
680
679
  end
681
680
 
682
- %w(new edit).each do |word|
681
+ %w[new edit].each do |word|
683
682
  it "should overwrite the default reserved words allowing the word '#{word}'" do
684
683
  friend = Friend.create(name: word)
685
684
  expect(friend.slugs).to include word
@@ -687,7 +686,7 @@ module Mongoid
687
686
  end
688
687
  end
689
688
  context 'when the model does not have any reserved words set' do
690
- %w(new edit).each do |word|
689
+ %w[new edit].each do |word|
691
690
  it "does not use the default reserved word '#{word}'" do
692
691
  book = Book.create(title: word)
693
692
  expect(book.slugs).not_to include word
@@ -736,7 +735,7 @@ module Mongoid
736
735
 
737
736
  context 'when called on an existing record with no slug' do
738
737
  let!(:book_no_slug) do
739
- if Mongoid::Compatibility::Version.mongoid5? || Mongoid::Compatibility::Version.mongoid6?
738
+ if Mongoid::Compatibility::Version.mongoid5_or_newer?
740
739
  Book.collection.insert_one(title: 'Proust and Signs')
741
740
  else
742
741
  Book.collection.insert(title: 'Proust and Signs')
@@ -796,7 +795,7 @@ module Mongoid
796
795
  it 'ensures uniqueness' do
797
796
  book1 = Book.create(title: 'A Thousand Plateaus', slugs: ['not-what-you-expected'])
798
797
  expect(book1.to_param).to eql 'not-what-you-expected'
799
- if Mongoid::Compatibility::Version.mongoid5? || Mongoid::Compatibility::Version.mongoid6?
798
+ if Mongoid::Compatibility::Version.mongoid5_or_newer?
800
799
  expect do
801
800
  Book.create(title: 'A Thousand Plateaus', slugs: ['not-what-you-expected'])
802
801
  end.to raise_error Mongo::Error::OperationFailure, /duplicate/
@@ -825,7 +824,7 @@ module Mongoid
825
824
  Book.create(title: 'Sleepyhead')
826
825
  book2 = Book.create(title: 'A Thousand Plateaus')
827
826
  book2.slugs.push 'sleepyhead'
828
- if Mongoid::Compatibility::Version.mongoid5? || Mongoid::Compatibility::Version.mongoid6?
827
+ if Mongoid::Compatibility::Version.mongoid5_or_newer?
829
828
  expect do
830
829
  book2.save
831
830
  end.to raise_error Mongo::Error::OperationFailure, /duplicate/
@@ -885,13 +884,13 @@ module Mongoid
885
884
  # Turn on i18n fallback
886
885
  require 'i18n/backend/fallbacks'
887
886
  I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks)
888
- ::I18n.fallbacks[:nl] = [:nl, :en]
887
+ ::I18n.fallbacks[:nl] = %i[nl en]
889
888
  expect(page.slug).to eql 'title-on-english'
890
889
  fallback_slug = page.slug
891
890
 
892
891
  fallback_page = begin
893
892
  PageSlugLocalized.find(fallback_slug)
894
- rescue
893
+ rescue StandardError
895
894
  nil
896
895
  end
897
896
  expect(fallback_page).to eq(page)
@@ -916,17 +915,17 @@ module Mongoid
916
915
  page = PageSlugLocalized.new
917
916
  page.title_translations = { 'en' => 'Title on English', 'nl' => 'Title on Netherlands' }
918
917
  page.save
919
- expect(page['_slugs']).to eq('en' => ['title-on-english'], 'nl' => ['title-on-netherlands'])
918
+ expect(page._slugs_translations).to eq('en' => ['title-on-english'], 'nl' => ['title-on-netherlands'])
920
919
  end
921
920
 
922
921
  it 'exact same title multiple langauges' do
923
922
  page = PageSlugLocalized.new
924
923
  page.title_translations = { 'en' => 'Title on English', 'nl' => 'Title on English' }
925
924
  page.save
926
- expect(page['_slugs']).to eq('en' => ['title-on-english'], 'nl' => ['title-on-english'])
925
+ expect(page._slugs_translations).to eq('en' => ['title-on-english'], 'nl' => ['title-on-english'])
927
926
 
928
927
  page = PageSlugLocalized.create(title_translations: { 'en' => 'Title on English2', 'nl' => 'Title on English2' })
929
- expect(page['_slugs']).to eq('en' => ['title-on-english2'], 'nl' => ['title-on-english2'])
928
+ expect(page._slugs_translations).to eq('en' => ['title-on-english2'], 'nl' => ['title-on-english2'])
930
929
  end
931
930
 
932
931
  it 'does not produce duplicate slugs' do
@@ -944,7 +943,7 @@ module Mongoid
944
943
  I18n.locale = old_locale
945
944
  page.title = 'Title on English'
946
945
  expect(page.title_translations).to eq('en' => 'Title on English', 'nl' => 'Title on Netherlands')
947
- expect(page['_slugs']).to eq('en' => ['title-on-english'], 'nl' => ['title-on-netherlands'])
946
+ expect(page._slugs_translations).to eq('en' => ['title-on-english'], 'nl' => ['title-on-netherlands'])
948
947
  end
949
948
 
950
949
  it 'does not produce duplicate slugs when one has changed' do
@@ -964,8 +963,8 @@ module Mongoid
964
963
  page.save
965
964
  expect(page.title_translations).to eq('en' => 'Modified Title on English',
966
965
  'nl' => 'Title on Netherlands')
967
- expect(page['_slugs']).to eq('en' => ['modified-title-on-english'],
968
- 'nl' => ['title-on-netherlands'])
966
+ expect(page._slugs_translations).to eq('en' => ['modified-title-on-english'],
967
+ 'nl' => ['title-on-netherlands'])
969
968
  end
970
969
 
971
970
  it 'does not produce duplicate slugs when transactions are set directly' do
@@ -974,7 +973,7 @@ module Mongoid
974
973
  page.save
975
974
  page.title_translations = { 'en' => 'Title on English', 'nl' => 'Title on Netherlands' }
976
975
  page.save
977
- expect(page['_slugs']).to eq('en' => ['title-on-english'], 'nl' => ['title-on-netherlands'])
976
+ expect(page._slugs_translations).to eq('en' => ['title-on-english'], 'nl' => ['title-on-netherlands'])
978
977
  end
979
978
 
980
979
  it 'does not produce duplicate slugs when transactions are set directly and one has changed' do
@@ -984,15 +983,15 @@ module Mongoid
984
983
  page.title_translations = { 'en' => 'Modified Title on English',
985
984
  'nl' => 'Title on Netherlands' }
986
985
  page.save
987
- expect(page['_slugs']).to eq('en' => ['modified-title-on-english'],
988
- 'nl' => ['title-on-netherlands'])
986
+ expect(page._slugs_translations).to eq('en' => ['modified-title-on-english'],
987
+ 'nl' => ['title-on-netherlands'])
989
988
  end
990
989
 
991
990
  it 'works with a custom slug strategy' do
992
991
  page = PageSlugLocalizedCustom.new
993
992
  page.title = 'a title for the slug'
994
993
  page.save
995
- expect(page['_slugs']).to eq('en' => ['a-title-for-the-slug'], 'nl' => ['a-title-for-the-slug'])
994
+ expect(page._slugs_translations).to eq('en' => ['a-title-for-the-slug'], 'nl' => ['a-title-for-the-slug'])
996
995
  end
997
996
  end
998
997
 
@@ -1048,13 +1047,13 @@ module Mongoid
1048
1047
  # Turn on i18n fallback
1049
1048
  require 'i18n/backend/fallbacks'
1050
1049
  I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks)
1051
- ::I18n.fallbacks[:nl] = [:nl, :en]
1050
+ ::I18n.fallbacks[:nl] = %i[nl en]
1052
1051
  expect(page.slug).to eql 'title-on-english'
1053
1052
  fallback_slug = page.slug
1054
1053
 
1055
1054
  fallback_page = begin
1056
1055
  PageSlugLocalizedHistory.find(fallback_slug)
1057
- rescue
1056
+ rescue StandardError
1058
1057
  nil
1059
1058
  end
1060
1059
  expect(fallback_page).to eq(page)
@@ -1067,8 +1066,8 @@ module Mongoid
1067
1066
  page.title_translations = { 'en' => 'Modified Title on English',
1068
1067
  'nl' => 'Modified Title on Netherlands' }
1069
1068
  page.save
1070
- expect(page['_slugs']).to eq('en' => ['title-on-english', 'modified-title-on-english'],
1071
- 'nl' => ['title-on-netherlands', 'modified-title-on-netherlands'])
1069
+ expect(page._slugs_translations).to eq('en' => ['title-on-english', 'modified-title-on-english'],
1070
+ 'nl' => ['title-on-netherlands', 'modified-title-on-netherlands'])
1072
1071
  end
1073
1072
 
1074
1073
  it 'does not produce duplicate slugs' do
@@ -1086,7 +1085,7 @@ module Mongoid
1086
1085
  I18n.locale = old_locale
1087
1086
  page.title = 'Title on English'
1088
1087
  expect(page.title_translations).to eq('en' => 'Title on English', 'nl' => 'Title on Netherlands')
1089
- expect(page['_slugs']).to eq('en' => ['title-on-english'], 'nl' => ['title-on-netherlands'])
1088
+ expect(page._slugs_translations).to eq('en' => ['title-on-english'], 'nl' => ['title-on-netherlands'])
1090
1089
  end
1091
1090
 
1092
1091
  it 'does not produce duplicate slugs when one has changed' do
@@ -1106,8 +1105,8 @@ module Mongoid
1106
1105
  page.save
1107
1106
  expect(page.title_translations).to eq('en' => 'Modified Title on English',
1108
1107
  'nl' => 'Title on Netherlands')
1109
- expect(page['_slugs']).to eq('en' => ['title-on-english', 'modified-title-on-english'],
1110
- 'nl' => ['title-on-netherlands'])
1108
+ expect(page._slugs_translations).to eq('en' => ['title-on-english', 'modified-title-on-english'],
1109
+ 'nl' => ['title-on-netherlands'])
1111
1110
  end
1112
1111
 
1113
1112
  it 'does not produce duplicate slugs when transactions are set directly' do
@@ -1116,7 +1115,7 @@ module Mongoid
1116
1115
  page.save
1117
1116
  page.title_translations = { 'en' => 'Title on English', 'nl' => 'Title on Netherlands' }
1118
1117
  page.save
1119
- expect(page['_slugs']).to eq('en' => ['title-on-english'], 'nl' => ['title-on-netherlands'])
1118
+ expect(page._slugs_translations).to eq('en' => ['title-on-english'], 'nl' => ['title-on-netherlands'])
1120
1119
  end
1121
1120
 
1122
1121
  it 'does not produce duplicate slugs when transactions are set directly and one has changed' do
@@ -1125,8 +1124,8 @@ module Mongoid
1125
1124
  page.save
1126
1125
  page.title_translations = { 'en' => 'Modified Title on English', 'nl' => 'Title on Netherlands' }
1127
1126
  page.save
1128
- expect(page['_slugs']).to eq('en' => ['title-on-english', 'modified-title-on-english'],
1129
- 'nl' => ['title-on-netherlands'])
1127
+ expect(page._slugs_translations).to eq('en' => ['title-on-english', 'modified-title-on-english'],
1128
+ 'nl' => ['title-on-netherlands'])
1130
1129
  end
1131
1130
  end
1132
1131
 
@@ -6,13 +6,10 @@ require 'awesome_print'
6
6
  require 'active_support'
7
7
  require 'active_support/deprecation'
8
8
  require 'mongoid'
9
- require 'mongoid/paranoia'
10
9
  require 'rspec/its'
11
10
  require 'mongoid/compatibility'
12
11
 
13
- require File.expand_path '../../lib/mongoid/slug', __FILE__
14
-
15
- require 'mongoid-observers' unless Mongoid.const_defined?(:Observer)
12
+ require File.expand_path '../lib/mongoid/slug', __dir__
16
13
 
17
14
  module Mongoid
18
15
  module Slug
@@ -32,24 +29,21 @@ Mongoid.configure do |config|
32
29
  config.connect_to database_id
33
30
  end
34
31
 
35
- %w(models shared).each do |dir|
32
+ %w[models shared].each do |dir|
36
33
  Dir["./spec/#{dir}/*.rb"].each { |f| require f }
37
34
  end
38
35
 
39
- I18n.available_locales = [:en, :nl]
36
+ I18n.available_locales = %i[en nl]
40
37
 
41
38
  RSpec.configure do |c|
42
39
  c.raise_errors_for_deprecations!
43
40
 
44
41
  c.before :all do
45
42
  Mongoid.logger.level = Logger::INFO
46
- if Mongoid::Compatibility::Version.mongoid5? || Mongoid::Compatibility::Version.mongoid6?
47
- Mongo::Logger.logger.level = Logger::INFO
48
- end
43
+ Mongo::Logger.logger.level = Logger::INFO if Mongoid::Compatibility::Version.mongoid5_or_newer?
49
44
  end
50
45
 
51
46
  c.before(:each) do
52
- Mongoid.purge!
53
47
  Author.create_indexes
54
48
  Book.create_indexes
55
49
  AuthorPolymorphic.create_indexes
@@ -57,7 +51,7 @@ RSpec.configure do |c|
57
51
  Mongoid::IdentityMap.clear if defined?(Mongoid::IdentityMap)
58
52
  end
59
53
 
60
- c.after(:all) do
54
+ c.after(:each) do
61
55
  if Mongoid::Compatibility::Version.mongoid3? || Mongoid::Compatibility::Version.mongoid4?
62
56
  Mongoid.default_session.drop
63
57
  else
@@ -3,7 +3,7 @@ require 'rake'
3
3
 
4
4
  describe 'mongoid_slug:set' do
5
5
  before :all do
6
- load File.expand_path('../../../lib/tasks/mongoid_slug.rake', __FILE__)
6
+ load File.expand_path('../../lib/tasks/mongoid_slug.rake', __dir__)
7
7
  Rake::Task.define_task(:environment)
8
8
  end
9
9
 
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: 5.3.3
4
+ version: 6.0.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: 2017-04-06 00:00:00.000000000 Z
11
+ date: 2018-08-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mongoid
@@ -53,7 +53,7 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '2.0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: guard-rspec
56
+ name: awesome_print
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -67,7 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: rake
70
+ name: guard-rspec
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
@@ -81,7 +81,7 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: rspec
84
+ name: rake
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">="
@@ -95,7 +95,7 @@ dependencies:
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
- name: rspec-its
98
+ name: rspec
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - ">="
@@ -109,7 +109,7 @@ dependencies:
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
- name: awesome_print
112
+ name: rspec-its
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - ">="
@@ -148,7 +148,6 @@ files:
148
148
  - lib/mongoid/slug.rb
149
149
  - lib/mongoid/slug/criteria.rb
150
150
  - lib/mongoid/slug/index.rb
151
- - lib/mongoid/slug/paranoia.rb
152
151
  - lib/mongoid/slug/railtie.rb
153
152
  - lib/mongoid/slug/slug_id_strategy.rb
154
153
  - lib/mongoid/slug/unique_slug.rb
@@ -164,7 +163,6 @@ files:
164
163
  - spec/models/book.rb
165
164
  - spec/models/book_polymorphic.rb
166
165
  - spec/models/caption.rb
167
- - spec/models/document_paranoid.rb
168
166
  - spec/models/entity.rb
169
167
  - spec/models/friend.rb
170
168
  - spec/models/incorrect_slug_persistence.rb
@@ -175,8 +173,6 @@ files:
175
173
  - spec/models/page_slug_localized.rb
176
174
  - spec/models/page_slug_localized_custom.rb
177
175
  - spec/models/page_slug_localized_history.rb
178
- - spec/models/paranoid_document.rb
179
- - spec/models/paranoid_permanent.rb
180
176
  - spec/models/partner.rb
181
177
  - spec/models/person.rb
182
178
  - spec/models/relationship.rb
@@ -185,7 +181,6 @@ files:
185
181
  - spec/models/without_slug.rb
186
182
  - spec/mongoid/criteria_spec.rb
187
183
  - spec/mongoid/index_spec.rb
188
- - spec/mongoid/paranoia_spec.rb
189
184
  - spec/mongoid/slug_spec.rb
190
185
  - spec/shared/indexes.rb
191
186
  - spec/spec_helper.rb
@@ -210,43 +205,39 @@ required_rubygems_version: !ruby/object:Gem::Requirement
210
205
  version: '0'
211
206
  requirements: []
212
207
  rubyforge_project: mongoid-slug
213
- rubygems_version: 2.6.8
208
+ rubygems_version: 2.7.6
214
209
  signing_key:
215
210
  specification_version: 4
216
211
  summary: Mongoid URL slugs
217
212
  test_files:
218
- - spec/models/alias.rb
213
+ - spec/mongoid/criteria_spec.rb
214
+ - spec/mongoid/slug_spec.rb
215
+ - spec/mongoid/index_spec.rb
216
+ - spec/spec_helper.rb
217
+ - spec/tasks/mongoid_slug_rake_spec.rb
218
+ - spec/shared/indexes.rb
219
219
  - spec/models/article.rb
220
- - spec/models/artist.rb
221
- - spec/models/artwork.rb
222
- - spec/models/author.rb
223
- - spec/models/author_polymorphic.rb
220
+ - spec/models/integer_id.rb
224
221
  - spec/models/book.rb
225
- - spec/models/book_polymorphic.rb
226
- - spec/models/caption.rb
227
- - spec/models/document_paranoid.rb
228
222
  - spec/models/entity.rb
229
- - spec/models/friend.rb
230
- - spec/models/incorrect_slug_persistence.rb
231
- - spec/models/integer_id.rb
232
- - spec/models/magazine.rb
223
+ - spec/models/caption.rb
224
+ - spec/models/without_slug.rb
225
+ - spec/models/artist.rb
226
+ - spec/models/string_id.rb
233
227
  - spec/models/page.rb
234
- - spec/models/page_localize.rb
235
228
  - spec/models/page_slug_localized.rb
236
- - spec/models/page_slug_localized_custom.rb
237
- - spec/models/page_slug_localized_history.rb
238
- - spec/models/paranoid_document.rb
239
- - spec/models/paranoid_permanent.rb
229
+ - spec/models/author.rb
230
+ - spec/models/friend.rb
231
+ - spec/models/subject.rb
232
+ - spec/models/magazine.rb
240
233
  - spec/models/partner.rb
234
+ - spec/models/alias.rb
241
235
  - spec/models/person.rb
236
+ - spec/models/page_slug_localized_custom.rb
242
237
  - spec/models/relationship.rb
243
- - spec/models/string_id.rb
244
- - spec/models/subject.rb
245
- - spec/models/without_slug.rb
246
- - spec/mongoid/criteria_spec.rb
247
- - spec/mongoid/index_spec.rb
248
- - spec/mongoid/paranoia_spec.rb
249
- - spec/mongoid/slug_spec.rb
250
- - spec/shared/indexes.rb
251
- - spec/spec_helper.rb
252
- - spec/tasks/mongoid_slug_rake_spec.rb
238
+ - spec/models/book_polymorphic.rb
239
+ - spec/models/page_slug_localized_history.rb
240
+ - spec/models/author_polymorphic.rb
241
+ - spec/models/incorrect_slug_persistence.rb
242
+ - spec/models/page_localize.rb
243
+ - spec/models/artwork.rb
@@ -1,20 +0,0 @@
1
- module Mongoid
2
- module Slug
3
- # Lightweight compatibility shim which adds the :restore callback to
4
- # older versions of Mongoid::Paranoia
5
- module Paranoia
6
- extend ActiveSupport::Concern
7
-
8
- included do
9
- define_model_callbacks :restore
10
-
11
- def restore_with_callbacks
12
- run_callbacks(:restore) do
13
- restore_without_callbacks
14
- end
15
- end
16
- alias_method_chain :restore, :callbacks
17
- end
18
- end
19
- end
20
- end
@@ -1,9 +0,0 @@
1
- class DocumentParanoid
2
- include Mongoid::Document
3
- # slug, then paranoia
4
- include Mongoid::Slug
5
- include Mongoid::Paranoia
6
-
7
- field :title
8
- slug :title
9
- end
@@ -1,8 +0,0 @@
1
- class ParanoidDocument
2
- include Mongoid::Document
3
- include Mongoid::Paranoia
4
- include Mongoid::Slug
5
-
6
- field :title
7
- slug :title
8
- end
@@ -1,10 +0,0 @@
1
- class ParanoidPermanent
2
- include Mongoid::Document
3
- include Mongoid::Paranoia
4
- include Mongoid::Slug
5
-
6
- field :title
7
- field :foo
8
-
9
- slug :title, scope: :foo, permanent: true
10
- end
@@ -1,230 +0,0 @@
1
- # encoding: utf-8
2
- require 'spec_helper'
3
-
4
- describe 'Mongoid::Paranoia with Mongoid::Slug' do
5
- let(:paranoid_doc) { ParanoidDocument.create!(title: 'slug') }
6
- let(:paranoid_doc_2) { ParanoidDocument.create!(title: 'slug') }
7
- let(:paranoid_perm) { ParanoidPermanent.create!(title: 'slug') }
8
- let(:paranoid_perm_2) { ParanoidPermanent.create!(title: 'slug') }
9
- let(:non_paranoid_doc) { Article.create!(title: 'slug') }
10
- subject { paranoid_doc }
11
-
12
- describe '.paranoid?' do
13
- context 'when Mongoid::Paranoia is included' do
14
- subject { paranoid_doc.class }
15
- specify { expect(subject.is_paranoid_doc?).to be true }
16
- end
17
-
18
- context 'when Mongoid::Paranoia not included' do
19
- subject { non_paranoid_doc.class }
20
- specify { expect(subject.is_paranoid_doc?).to be false }
21
- end
22
- end
23
-
24
- describe '#paranoid_deleted?' do
25
- context 'when Mongoid::Paranoia is included' do
26
- context 'when not destroyed' do
27
- specify { expect(subject.paranoid_deleted?).to be false }
28
- end
29
-
30
- context 'when destroyed' do
31
- before { subject.destroy }
32
- specify { expect(subject.paranoid_deleted?).to be true }
33
- end
34
- end
35
-
36
- context 'when Mongoid::Paranoia not included' do
37
- subject { non_paranoid_doc }
38
- specify { expect(subject.paranoid_deleted?).to be false }
39
- end
40
- end
41
-
42
- describe 'restore callbacks' do
43
- context 'when Mongoid::Paranoia is included' do
44
- subject { paranoid_doc.class }
45
- it { is_expected.to respond_to(:before_restore) }
46
- it { is_expected.to respond_to(:after_restore) }
47
- end
48
-
49
- context 'when Mongoid::Paranoia not included' do
50
- it { is_expected.to_not respond_to(:before_restore) }
51
- it { is_expected.to_not respond_to(:after_restore) }
52
- end
53
- end
54
-
55
- describe 'index' do
56
- context 'simple index' do
57
- before { ParanoidDocument.create_indexes }
58
- after { ParanoidDocument.remove_indexes }
59
- subject { ParanoidDocument }
60
-
61
- it_should_behave_like 'has an index', { _slugs: 1 }, unique: true, sparse: true
62
- end
63
-
64
- context 'compound index' do
65
- before { ParanoidPermanent.create_indexes }
66
- after { ParanoidPermanent.remove_indexes }
67
- subject { ParanoidPermanent }
68
-
69
- it_should_behave_like 'has an index', { foo: 1, _slugs: 1 }, unique: nil, sparse: nil
70
- end
71
- end
72
-
73
- shared_examples_for 'paranoid slugs' do
74
- context 'querying' do
75
- it 'returns paranoid_doc for correct slug' do
76
- expect(subject.class.find(subject.slug)).to eq subject
77
- end
78
- end
79
-
80
- context 'delete (callbacks not fired)' do
81
- before { subject.delete }
82
-
83
- it 'retains slug value' do
84
- expect(subject.slug).to eq 'slug'
85
- expect(subject.class.unscoped.find('slug')).to eq subject
86
- end
87
- end
88
-
89
- context 'destroy' do
90
- before { subject.destroy }
91
-
92
- it 'unsets slug value when destroyed' do
93
- expect(subject._slugs).to eq []
94
- expect(subject.slug).to be_nil
95
- end
96
-
97
- it 'persists the removed slug' do
98
- expect(subject.reload._slugs).to be nil
99
- expect(subject.reload.slug).to eq subject._id.to_s
100
- end
101
-
102
- it 'persists the removed slug in the database' do
103
- expect(subject.class.unscoped.exists(_slugs: false).first).to eq subject
104
- expect { subject.class.unscoped.find('slug') }.to raise_error(Mongoid::Errors::DocumentNotFound)
105
- end
106
-
107
- context 'when saving the doc again' do
108
- before { subject.save }
109
-
110
- it 'should have the default slug value' do
111
- expect(subject._slugs).to eq []
112
- expect(subject.slug).to be_nil
113
- end
114
-
115
- it 'the slug remains unset in the database' do
116
- expect(subject.class.unscoped.exists(_slugs: false).first).to eq subject
117
- expect { subject.class.unscoped.find('slug') }.to raise_error(Mongoid::Errors::DocumentNotFound)
118
- end
119
- end
120
- end
121
-
122
- context 'restore' do
123
- before do
124
- subject.destroy
125
- subject.restore
126
- end
127
-
128
- it 'resets slug value when restored' do
129
- expect(subject.slug).to eq 'slug'
130
- expect(subject.reload.slug).to eq 'slug'
131
- end
132
- end
133
-
134
- context 'multiple documents' do
135
- it 'new documents should be able to use the slug of destroyed documents' do
136
- expect(subject.slug).to eq 'slug'
137
- subject.destroy
138
- expect(subject.reload.slug).to eq subject._id.to_s
139
- expect(other_doc.slug).to eq 'slug'
140
- subject.restore
141
- expect(subject.slug).to eq 'slug-1'
142
- expect(subject.reload.slug).to eq 'slug-1'
143
- end
144
-
145
- it 'should allow multiple documents to be destroyed without index conflict' do
146
- expect(subject.slug).to eq 'slug'
147
- subject.destroy
148
- expect(subject.reload.slug).to eq subject._id.to_s
149
- expect(other_doc.slug).to eq 'slug'
150
- other_doc.destroy
151
- expect(other_doc.reload.slug).to eq other_doc._id.to_s
152
- end
153
- end
154
- end
155
-
156
- [ParanoidDocument, DocumentParanoid].each do |paranoid_klass|
157
- context paranoid_klass.to_s do
158
- let(:paranoid_doc) { paranoid_klass.create!(title: 'slug') }
159
- let(:non_paranoid_doc) { Article.create!(title: 'slug') }
160
-
161
- subject { paranoid_doc }
162
-
163
- describe '.paranoid?' do
164
- context 'when Mongoid::Paranoia is included' do
165
- subject { paranoid_doc.class }
166
- its(:is_paranoid_doc?) { is_expected.to be_truthy }
167
- end
168
-
169
- context 'when Mongoid::Paranoia not included' do
170
- subject { non_paranoid_doc.class }
171
- its(:is_paranoid_doc?) { is_expected.to be_falsey }
172
- end
173
- end
174
-
175
- describe '#paranoid_deleted?' do
176
- context 'when Mongoid::Paranoia is included' do
177
- context 'when not destroyed' do
178
- its(:paranoid_deleted?) { is_expected.to be_falsey }
179
- end
180
-
181
- context 'when destroyed' do
182
- before { subject.destroy }
183
- its(:paranoid_deleted?) { is_expected.to be_truthy }
184
- end
185
- end
186
-
187
- context 'when Mongoid::Paranoia not included' do
188
- subject { non_paranoid_doc }
189
- its(:paranoid_deleted?) { is_expected.to be_falsey }
190
- end
191
- end
192
-
193
- describe 'restore callbacks' do
194
- context 'when Mongoid::Paranoia is included' do
195
- subject { paranoid_doc.class }
196
- it { is_expected.to respond_to(:before_restore) }
197
- it { is_expected.to respond_to(:after_restore) }
198
- end
199
-
200
- context 'when Mongoid::Paranoia not included' do
201
- it { is_expected.not_to respond_to(:before_restore) }
202
- it { is_expected.not_to respond_to(:after_restore) }
203
- end
204
- end
205
-
206
- describe 'index' do
207
- before { paranoid_klass.create_indexes }
208
- after { paranoid_klass.remove_indexes }
209
- subject { paranoid_klass }
210
-
211
- it_should_behave_like 'has an index', { _slugs: 1 }, unique: true, sparse: true
212
- end
213
-
214
- context 'non-permanent slug' do
215
- let(:paranoid_doc_2) { paranoid_klass.create!(title: 'slug') }
216
- subject { paranoid_doc }
217
- let(:other_doc) { paranoid_doc_2 }
218
- it_behaves_like 'paranoid slugs'
219
- end
220
- end
221
- end
222
-
223
- context 'permanent slug' do
224
- let(:paranoid_perm) { ParanoidPermanent.create!(title: 'slug') }
225
- let(:paranoid_perm_2) { ParanoidPermanent.create!(title: 'slug') }
226
- subject { paranoid_perm }
227
- let(:other_doc) { paranoid_perm_2 }
228
- it_behaves_like 'paranoid slugs'
229
- end
230
- end