mongoid-paranoia 1.3.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +20 -0
- data/.travis.yml +2 -1
- data/README.md +1 -1
- data/lib/mongoid/core_ext/relations/embedded/many.rb +0 -1
- data/lib/mongoid/core_ext/validatable/uniqueness.rb +1 -3
- data/lib/mongoid/paranoia.rb +12 -13
- data/lib/mongoid/paranoia/version.rb +1 -1
- data/mongoid-paranoia.gemspec +3 -3
- data/spec/app/models/address.rb +9 -8
- data/spec/app/models/appointment.rb +1 -1
- data/spec/app/models/paranoid_post.rb +2 -2
- data/spec/app/models/person.rb +25 -21
- data/spec/app/models/phone.rb +1 -1
- data/spec/app/models/service.rb +1 -1
- data/spec/app/models/symptom.rb +1 -1
- data/spec/app/models/tag.rb +1 -1
- data/spec/app/models/video.rb +1 -1
- data/spec/mongoid/attributes/nested_spec.rb +39 -57
- data/spec/mongoid/criteria/scopable_spec.rb +14 -24
- data/spec/mongoid/document_spec.rb +6 -8
- data/spec/mongoid/paranoia_spec.rb +153 -201
- data/spec/mongoid/scoping_spec.rb +14 -24
- data/spec/mongoid/validatable/uniqueness_spec.rb +14 -21
- data/spec/spec_helper.rb +18 -21
- metadata +8 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f9d063648fd0353a0d35ebf228c001fa23768746
|
4
|
+
data.tar.gz: 45d30f5c118fea59f4105da8f5780d5efe120a41
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d3d00fdac7bc5d5b995d0888f33c6ee5fd1f61ecd61a72798a7958ba1d3141cd7cfceea7a8a09bcdc3249afd5c03cfb0fd1e46b813a228f3f0d59056f2c2e6b7
|
7
|
+
data.tar.gz: b69102aff52a05aae1bfb282389d1cf30251ce9b1499378aca300fbd8b754f23628f68f5579737bac6a63e70286cac692635f3743624b3716fc792daba6f1835
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
AllCops:
|
2
|
+
TargetRubyVersion: 2.2
|
3
|
+
|
4
|
+
Documentation:
|
5
|
+
Enabled: false
|
6
|
+
|
7
|
+
Style/AlignParameters:
|
8
|
+
EnforcedStyle: with_fixed_indentation
|
9
|
+
|
10
|
+
Style/Alias:
|
11
|
+
EnforcedStyle: prefer_alias_method
|
12
|
+
|
13
|
+
Style/IndentArray:
|
14
|
+
EnforcedStyle: consistent
|
15
|
+
|
16
|
+
Style/IndentHash:
|
17
|
+
EnforcedStyle: consistent
|
18
|
+
|
19
|
+
Style/MultilineMethodCallIndentation:
|
20
|
+
EnforcedStyle: indented
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -56,7 +56,7 @@ Person.deleted # Returns documents that have been "flagged" as deleted.
|
|
56
56
|
|
57
57
|
(The MIT license)
|
58
58
|
|
59
|
-
Copyright (c) 2013-2015 Mario Uher
|
59
|
+
Copyright (c) 2009-2013 Durran Jordan, 2013-2015 Mario Uher
|
60
60
|
|
61
61
|
Permission is hereby granted, free of charge, to any person obtaining
|
62
62
|
a copy of this software and associated documentation files (the
|
@@ -1,7 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module Mongoid
|
3
3
|
module Validatable
|
4
|
-
|
5
4
|
# Validates whether or not a field is unique against the documents in the
|
6
5
|
# database.
|
7
6
|
#
|
@@ -14,7 +13,6 @@ module Mongoid
|
|
14
13
|
# validates_uniqueness_of :title
|
15
14
|
# end
|
16
15
|
class UniquenessValidator < ActiveModel::EachValidator
|
17
|
-
|
18
16
|
# Scope the criteria to the scope options provided.
|
19
17
|
#
|
20
18
|
# @api private
|
@@ -28,7 +26,7 @@ module Mongoid
|
|
28
26
|
# @return [ Criteria ] The scoped criteria.
|
29
27
|
#
|
30
28
|
# @since 2.3.0
|
31
|
-
def scope(criteria, document,
|
29
|
+
def scope(criteria, document, _attribute)
|
32
30
|
Array.wrap(options[:scope]).each do |item|
|
33
31
|
name = document.database_field_name(item)
|
34
32
|
criteria = criteria.where(item => document.attributes[name])
|
data/lib/mongoid/paranoia.rb
CHANGED
@@ -5,7 +5,6 @@ require 'mongoid/core_ext/validatable/uniqueness'
|
|
5
5
|
|
6
6
|
# encoding: utf-8
|
7
7
|
module Mongoid
|
8
|
-
|
9
8
|
# Include this module to get soft deletion of root level documents.
|
10
9
|
# This will add a deleted_at field to the +Document+, managed automatically.
|
11
10
|
# Potentially incompatible with unique indices. (if collisions with deleted items)
|
@@ -23,8 +22,8 @@ module Mongoid
|
|
23
22
|
field :deleted_at, type: Time
|
24
23
|
self.paranoid = true
|
25
24
|
|
26
|
-
default_scope ->{ where(deleted_at: nil) }
|
27
|
-
scope :deleted, ->{ ne(deleted_at: nil) }
|
25
|
+
default_scope -> { where(deleted_at: nil) }
|
26
|
+
scope :deleted, -> { ne(deleted_at: nil) }
|
28
27
|
end
|
29
28
|
|
30
29
|
# Delete the paranoid +Document+ from the database completely. This will
|
@@ -52,19 +51,19 @@ module Mongoid
|
|
52
51
|
#
|
53
52
|
# @todo Remove Mongoid 4 support.
|
54
53
|
# @since 1.0.0
|
55
|
-
def remove_with_paranoia(
|
54
|
+
def remove_with_paranoia(_options = {})
|
56
55
|
cascade!
|
57
56
|
time = self.deleted_at = Time.now
|
58
57
|
query = paranoid_collection.find(atomic_selector)
|
59
58
|
query.respond_to?(:update_one) ?
|
60
|
-
query.update_one(
|
61
|
-
query.update(
|
59
|
+
query.update_one('$set' => { paranoid_field => time }) :
|
60
|
+
query.update('$set' => { paranoid_field => time })
|
62
61
|
|
63
62
|
@destroyed = true
|
64
63
|
true
|
65
64
|
end
|
66
65
|
alias_method_chain :remove, :paranoia
|
67
|
-
|
66
|
+
alias_method :delete, :remove_with_paranoia
|
68
67
|
|
69
68
|
# Delete the paranoid +Document+ from the database completely.
|
70
69
|
#
|
@@ -89,7 +88,7 @@ module Mongoid
|
|
89
88
|
def destroyed?
|
90
89
|
(@destroyed ||= false) || !!deleted_at
|
91
90
|
end
|
92
|
-
|
91
|
+
alias_method :deleted?, :destroyed?
|
93
92
|
|
94
93
|
def persisted?
|
95
94
|
!new_record? && !(@destroyed ||= false)
|
@@ -108,10 +107,10 @@ module Mongoid
|
|
108
107
|
def restore
|
109
108
|
query = paranoid_collection.find(atomic_selector)
|
110
109
|
query.respond_to?(:update_one) ?
|
111
|
-
query.update_one(
|
112
|
-
query.update(
|
110
|
+
query.update_one('$unset' => { paranoid_field => true }) :
|
111
|
+
query.update('$unset' => { paranoid_field => true })
|
113
112
|
|
114
|
-
attributes.delete(
|
113
|
+
attributes.delete('deleted_at')
|
115
114
|
@destroyed = false
|
116
115
|
true
|
117
116
|
end
|
@@ -132,7 +131,7 @@ module Mongoid
|
|
132
131
|
#
|
133
132
|
# @since 2.3.1
|
134
133
|
def paranoid_collection
|
135
|
-
embedded? ? _root.collection :
|
134
|
+
embedded? ? _root.collection : collection
|
136
135
|
end
|
137
136
|
|
138
137
|
# Get the field to be used for paranoid operations.
|
@@ -144,7 +143,7 @@ module Mongoid
|
|
144
143
|
#
|
145
144
|
# @since 2.3.1
|
146
145
|
def paranoid_field
|
147
|
-
embedded? ? "#{atomic_position}.deleted_at" :
|
146
|
+
embedded? ? "#{atomic_position}.deleted_at" : 'deleted_at'
|
148
147
|
end
|
149
148
|
end
|
150
149
|
end
|
data/mongoid-paranoia.gemspec
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
|
1
|
+
$LOAD_PATH << File.expand_path('../lib', __FILE__)
|
2
2
|
require 'mongoid/paranoia/version'
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
5
|
gem.name = 'mongoid-paranoia'
|
6
6
|
gem.version = Mongoid::Paranoia::VERSION
|
7
|
-
gem.authors = 'Mario Uher'
|
8
|
-
gem.email = 'uher.mario@gmail.com'
|
7
|
+
gem.authors = ['Durran Jordan', 'Mario Uher']
|
8
|
+
gem.email = ['durran@gmail.com', 'uher.mario@gmail.com']
|
9
9
|
gem.homepage = 'https://github.com/haihappen/mongoid-paranoia'
|
10
10
|
gem.summary = 'Extraction of mongoid-paranoia into its own gem.'
|
11
11
|
gem.description = "There may be times when you don't want documents to actually get deleted from the database, but \"flagged\" as deleted."
|
data/spec/app/models/address.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
class Address
|
2
2
|
include Mongoid::Document
|
3
3
|
|
4
|
-
field :_id, type: String, default: ->{ street.try(:parameterize) }
|
4
|
+
field :_id, type: String, default: -> { street.try(:parameterize) }
|
5
5
|
|
6
6
|
attr_accessor :mode
|
7
7
|
|
@@ -25,10 +25,11 @@ class Address
|
|
25
25
|
|
26
26
|
embedded_in :addressable, polymorphic: true do
|
27
27
|
def extension
|
28
|
-
|
28
|
+
'Testing'
|
29
29
|
end
|
30
|
+
|
30
31
|
def doctor?
|
31
|
-
title ==
|
32
|
+
title == 'Dr'
|
32
33
|
end
|
33
34
|
end
|
34
35
|
|
@@ -38,10 +39,10 @@ class Address
|
|
38
39
|
belongs_to :account
|
39
40
|
belongs_to :band
|
40
41
|
|
41
|
-
scope :without_postcode, ->{ where(postcode: nil) }
|
42
|
-
scope :rodeo, ->{ where(street:
|
42
|
+
scope :without_postcode, -> { where(postcode: nil) }
|
43
|
+
scope :rodeo, -> { where(street: 'Rodeo Dr') } do
|
43
44
|
def mansion?
|
44
|
-
all? { |address| address.street ==
|
45
|
+
all? { |address| address.street == 'Rodeo Dr' }
|
45
46
|
end
|
46
47
|
end
|
47
48
|
|
@@ -58,11 +59,11 @@ class Address
|
|
58
59
|
|
59
60
|
class << self
|
60
61
|
def california
|
61
|
-
where(state:
|
62
|
+
where(state: 'CA')
|
62
63
|
end
|
63
64
|
|
64
65
|
def homes
|
65
|
-
where(address_type:
|
66
|
+
where(address_type: 'Home')
|
66
67
|
end
|
67
68
|
|
68
69
|
def streets
|
@@ -17,7 +17,7 @@ class ParanoidPost
|
|
17
17
|
has_many :authors, dependent: :delete
|
18
18
|
has_many :titles, dependent: :restrict
|
19
19
|
|
20
|
-
scope :recent, ->{ where(created_at: {
|
20
|
+
scope :recent, -> { where(created_at: { '$lt' => Time.now, '$gt' => 30.days.ago }) }
|
21
21
|
|
22
22
|
before_destroy :before_destroy_stub
|
23
23
|
after_destroy :after_destroy_stub
|
@@ -32,7 +32,7 @@ class ParanoidPost
|
|
32
32
|
|
33
33
|
class << self
|
34
34
|
def old
|
35
|
-
where(created_at: {
|
35
|
+
where(created_at: { '$lt' => 30.days.ago })
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
data/spec/app/models/person.rb
CHANGED
@@ -9,7 +9,7 @@ class Person
|
|
9
9
|
field :title
|
10
10
|
field :terms, type: Boolean
|
11
11
|
field :pets, type: Boolean, default: false
|
12
|
-
field :age, type: Integer, default:
|
12
|
+
field :age, type: Integer, default: '100'
|
13
13
|
field :dob, type: Date
|
14
14
|
field :employer_id
|
15
15
|
field :lunch_time, type: Time
|
@@ -17,7 +17,7 @@ class Person
|
|
17
17
|
field :map, type: Hash
|
18
18
|
field :map_with_default, type: Hash, default: {}
|
19
19
|
field :score, type: Integer
|
20
|
-
field :blood_alcohol_content, type: Float, default: ->{ 0.0 }
|
20
|
+
field :blood_alcohol_content, type: Float, default: -> { 0.0 }
|
21
21
|
field :last_drink_taken_at, type: Date
|
22
22
|
field :ssn
|
23
23
|
field :owner_id, type: Integer
|
@@ -37,18 +37,19 @@ class Person
|
|
37
37
|
index name: 1
|
38
38
|
index title: 1
|
39
39
|
|
40
|
-
index({ ssn: 1 },
|
40
|
+
index({ ssn: 1 }, unique: true)
|
41
41
|
|
42
42
|
attr_reader :rescored
|
43
43
|
|
44
44
|
embeds_many :favorites, order: :title.desc, inverse_of: :perp, validate: false
|
45
|
-
embeds_many :videos, order: [[
|
46
|
-
embeds_many :phone_numbers, class_name:
|
45
|
+
embeds_many :videos, order: [[:title, :asc]], validate: false
|
46
|
+
embeds_many :phone_numbers, class_name: 'Phone', validate: false
|
47
47
|
embeds_many :phones, store_as: :mobile_phones, validate: false
|
48
48
|
embeds_many :addresses, as: :addressable, validate: false do
|
49
49
|
def extension
|
50
|
-
|
50
|
+
'Testing'
|
51
51
|
end
|
52
|
+
|
52
53
|
def find_by_street(street)
|
53
54
|
where(street: street).first
|
54
55
|
end
|
@@ -61,20 +62,21 @@ class Person
|
|
61
62
|
embeds_many :appointments, validate: false
|
62
63
|
|
63
64
|
embeds_one :passport, autobuild: true, store_as: :pass, validate: false
|
64
|
-
embeds_one :pet, class_name:
|
65
|
+
embeds_one :pet, class_name: 'Animal', validate: false
|
65
66
|
embeds_one :name, as: :namable, validate: false do
|
66
67
|
def extension
|
67
|
-
|
68
|
+
'Testing'
|
68
69
|
end
|
70
|
+
|
69
71
|
def dawkins?
|
70
|
-
first_name ==
|
72
|
+
first_name == 'Richard' && last_name == 'Dawkins'
|
71
73
|
end
|
72
74
|
end
|
73
75
|
embeds_one :quiz, validate: false
|
74
76
|
|
75
77
|
has_one :game, dependent: :destroy, validate: false do
|
76
78
|
def extension
|
77
|
-
|
79
|
+
'Testing'
|
78
80
|
end
|
79
81
|
end
|
80
82
|
|
@@ -83,7 +85,7 @@ class Person
|
|
83
85
|
dependent: :delete,
|
84
86
|
validate: false do
|
85
87
|
def extension
|
86
|
-
|
88
|
+
'Testing'
|
87
89
|
end
|
88
90
|
end
|
89
91
|
has_many :ordered_posts, order: :rating.desc, validate: false
|
@@ -121,9 +123,9 @@ class Person
|
|
121
123
|
accepts_nested_attributes_for :quiz
|
122
124
|
accepts_nested_attributes_for :services, allow_destroy: true
|
123
125
|
|
124
|
-
scope :minor, ->{ where(:age.lt => 18) }
|
125
|
-
scope :without_ssn, ->{ without(:ssn) }
|
126
|
-
scope :search, ->(query){ any_of(
|
126
|
+
scope :minor, -> { where(:age.lt => 18) }
|
127
|
+
scope :without_ssn, -> { without(:ssn) }
|
128
|
+
scope :search, ->(query) { any_of(title: query) }
|
127
129
|
|
128
130
|
def score_with_rescoring=(score)
|
129
131
|
@rescored = score.to_i + 20
|
@@ -134,7 +136,7 @@ class Person
|
|
134
136
|
|
135
137
|
def update_addresses
|
136
138
|
addresses.each do |address|
|
137
|
-
address.street =
|
139
|
+
address.street = 'Updated Address'
|
138
140
|
end
|
139
141
|
end
|
140
142
|
|
@@ -154,11 +156,13 @@ class Person
|
|
154
156
|
def accepted
|
155
157
|
scoped.where(terms: true)
|
156
158
|
end
|
159
|
+
|
157
160
|
def knight
|
158
|
-
scoped.where(title:
|
161
|
+
scoped.where(title: 'Sir')
|
159
162
|
end
|
163
|
+
|
160
164
|
def old
|
161
|
-
scoped.where(age: {
|
165
|
+
scoped.where(age: { '$gt' => 50 })
|
162
166
|
end
|
163
167
|
end
|
164
168
|
|
@@ -175,10 +179,10 @@ class Person
|
|
175
179
|
end
|
176
180
|
|
177
181
|
def preference_names=(names)
|
178
|
-
names.split(
|
182
|
+
names.split(',').each do |name|
|
179
183
|
preference = Preference.where(name: name).first
|
180
184
|
if preference
|
181
|
-
|
185
|
+
preferences << preference
|
182
186
|
else
|
183
187
|
preferences.build(name: name)
|
184
188
|
end
|
@@ -186,7 +190,7 @@ class Person
|
|
186
190
|
end
|
187
191
|
|
188
192
|
def set_on_map_with_default=(value)
|
189
|
-
|
193
|
+
map_with_default['key'] = value
|
190
194
|
end
|
191
195
|
|
192
196
|
reset_callbacks(:validate)
|
@@ -195,4 +199,4 @@ class Person
|
|
195
199
|
reset_callbacks(:destroy)
|
196
200
|
end
|
197
201
|
|
198
|
-
require
|
202
|
+
require 'app/models/doctor'
|
data/spec/app/models/phone.rb
CHANGED
data/spec/app/models/service.rb
CHANGED
@@ -5,7 +5,7 @@ class Service
|
|
5
5
|
field :after_destroy_called, type: Boolean, default: false
|
6
6
|
field :after_initialize_called, type: Boolean, default: false
|
7
7
|
embedded_in :person
|
8
|
-
belongs_to :target, class_name:
|
8
|
+
belongs_to :target, class_name: 'User'
|
9
9
|
validates_numericality_of :sid
|
10
10
|
|
11
11
|
before_destroy do |doc|
|
data/spec/app/models/symptom.rb
CHANGED
data/spec/app/models/tag.rb
CHANGED