mongoid-slug 5.3.3 → 6.0.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 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