mongoid_monkey 0.2.4 → 0.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +2 -1
- data/lib/patches/embedded_touch.rb +79 -20
- data/lib/version.rb +1 -1
- data/spec/app/models/book.rb +6 -0
- data/spec/app/models/edit.rb +5 -0
- data/spec/app/models/page.rb +6 -0
- data/spec/app/models/wiki_page.rb +8 -0
- data/spec/unit/embedded_touch_spec.rb +39 -16
- metadata +10 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3993c5f5fbdf5f1f30b9a824ffbd3447772bf68d
|
4
|
+
data.tar.gz: 77026f83baf29fd6ebbcc63c7487818d3b0e081c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a64eee10db5554f9f068522d8d571a7d42ffeabf1b14b84df8b8052eb1730311cc6f4964dd4bbfead35bbd24f078f68f8cd597a56d328993e26f11563a01bb6f
|
7
|
+
data.tar.gz: 935a41fc23448476f511e49fba9fea2fd7e546625758bb26e78c6f7f2c784fedaae1392158dd2417701e0afd7551fa535264ff7d84d425e478b8d0ac9cebd77a
|
data/README.md
CHANGED
@@ -37,7 +37,8 @@ If you would only like some of the patches, please copy and paste the code to yo
|
|
37
37
|
| `instrument.rb` | Backport instrumentation change to Moped 1. | ● | ○ | ○ |
|
38
38
|
| `reorder.rb` | Backport `Criteria#reorder` method from Mongoid 4. | ● | ○ | ○ |
|
39
39
|
| `only_pluck_localized.rb` | Backport [PR #4299](https://github.com/mongodb/mongoid/pull/4299) from Mongoid 6 which fixes `#only`, `#without`, and `#pluck` with localized fields. | ● | × | × |
|
40
|
-
| `embedded_touch.rb` | Backport [Issue #3310](https://github.com/mongodb/mongoid/commit/a94c2f43573e58f973913c881ad9d11d62bf857c) from Mongoid 4 to add `:touch` option to `embedded_in`. | ● | ○ | ○ |
|
40
|
+
| `embedded_touch.rb` (1) | Backport [Issue #3310](https://github.com/mongodb/mongoid/commit/a94c2f43573e58f973913c881ad9d11d62bf857c) from Mongoid 4 to add `:touch` option to `embedded_in`. | ● | ○ | ○ |
|
41
|
+
| `embedded_touch.rb` (2) | Backport [PR #4392](https://github.com/mongodb/mongoid/pull/4392) from Mongoid 6 to fix an infinite loop issue related to `:touch` callbacks. | ● | ● | ● |
|
41
42
|
| `index_options.rb` | Backport latest index valid index options from Mongoid 6. | ● | ● | ○ |
|
42
43
|
|
43
44
|
### License
|
@@ -1,37 +1,96 @@
|
|
1
|
-
# Backport
|
1
|
+
# Backport support #embedded_in :touch option from Mongoid 4 to Mongoid 3.
|
2
|
+
# Also support touch callback on update, and fix infinite loop issue.
|
2
3
|
|
3
4
|
if Mongoid::VERSION =~ /\A3\./
|
4
5
|
|
5
6
|
module Mongoid
|
6
|
-
module Relations
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
module Relations
|
8
|
+
module Embedded
|
9
|
+
class In < Relations::One
|
10
|
+
class << self
|
11
|
+
def valid_options
|
12
|
+
[ :autobuild, :cyclic, :polymorphic, :touch ]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
module Macros
|
19
|
+
module ClassMethods
|
20
|
+
|
21
|
+
def embedded_in(name, options = {}, &block)
|
22
|
+
if ancestors.include?(Mongoid::Versioning)
|
23
|
+
raise Errors::VersioningNotOnRoot.new(self)
|
24
|
+
end
|
25
|
+
meta = characterize(name, Embedded::In, options, &block)
|
26
|
+
self.embedded = true
|
27
|
+
relate(name, meta)
|
28
|
+
builder(name, meta).creator(name, meta)
|
29
|
+
touchable(meta)
|
30
|
+
add_counter_cache_callbacks(meta) if meta.counter_cached?
|
31
|
+
meta
|
12
32
|
end
|
13
33
|
end
|
14
34
|
end
|
15
|
-
end
|
16
35
|
|
17
|
-
|
18
|
-
|
36
|
+
module Touchable
|
37
|
+
module ClassMethods
|
19
38
|
|
20
|
-
|
21
|
-
|
22
|
-
|
39
|
+
def touchable(metadata)
|
40
|
+
if metadata.touchable?
|
41
|
+
name = metadata.name
|
42
|
+
method_name = define_relation_touch_method(name)
|
43
|
+
after_save method_name
|
44
|
+
after_destroy method_name
|
45
|
+
after_touch method_name
|
46
|
+
end
|
47
|
+
self
|
23
48
|
end
|
24
|
-
meta = characterize(name, Embedded::In, options, &block)
|
25
|
-
self.embedded = true
|
26
|
-
relate(name, meta)
|
27
|
-
builder(name, meta).creator(name, meta)
|
28
|
-
touchable(meta)
|
29
|
-
add_counter_cache_callbacks(meta) if meta.counter_cached?
|
30
|
-
meta
|
31
49
|
end
|
32
50
|
end
|
33
51
|
end
|
52
|
+
|
53
|
+
module Callbacks
|
54
|
+
def cascadable_children(kind, children = Set.new)
|
55
|
+
embedded_relations.each_pair do |name, metadata|
|
56
|
+
next unless metadata.cascading_callbacks?
|
57
|
+
without_autobuild do
|
58
|
+
delayed_pulls = delayed_atomic_pulls[name]
|
59
|
+
delayed_unsets = delayed_atomic_unsets[name]
|
60
|
+
children.merge(delayed_pulls) if delayed_pulls
|
61
|
+
children.merge(delayed_unsets) if delayed_unsets
|
62
|
+
relation = send(name)
|
63
|
+
Array.wrap(relation).each do |child|
|
64
|
+
next if children.include?(child)
|
65
|
+
children.add(child) if cascadable_child?(kind, child, metadata)
|
66
|
+
child.send(:cascadable_children, kind, children)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
children.to_a
|
71
|
+
end
|
72
|
+
|
73
|
+
def cascadable_child?(kind, child, metadata)
|
74
|
+
return false if kind == :initialize || kind == :find || kind == :touch
|
75
|
+
return false if kind == :validate && metadata.validate?
|
76
|
+
child.callback_executable?(kind) ? child.in_callback_state?(kind) : false
|
77
|
+
end
|
78
|
+
end
|
34
79
|
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
if Mongoid::VERSION =~ /\A[45]\./
|
84
|
+
|
85
|
+
module Mongoid
|
86
|
+
|
87
|
+
module Interceptable
|
88
|
+
def cascadable_child?(kind, child, metadata)
|
89
|
+
return false if kind == :initialize || kind == :find || kind == :touch
|
90
|
+
return false if kind == :validate && metadata.validate?
|
91
|
+
child.callback_executable?(kind) ? child.in_callback_state?(kind) : false
|
92
|
+
end
|
93
|
+
end
|
35
94
|
end
|
36
95
|
|
37
96
|
end
|
data/lib/version.rb
CHANGED
@@ -1,21 +1,6 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
|
-
if Mongoid::VERSION =~ /\
|
4
|
-
|
5
|
-
class Edit
|
6
|
-
include Mongoid::Document
|
7
|
-
include Mongoid::Timestamps::Updated
|
8
|
-
embedded_in :wiki_page, touch: true
|
9
|
-
end
|
10
|
-
|
11
|
-
class WikiPage
|
12
|
-
include Mongoid::Document
|
13
|
-
include Mongoid::Timestamps
|
14
|
-
|
15
|
-
field :title, type: String
|
16
|
-
|
17
|
-
embeds_many :edits, validate: false
|
18
|
-
end
|
3
|
+
if Mongoid::VERSION =~ /\A[345]\./
|
19
4
|
|
20
5
|
describe Mongoid::Relations::Embedded::In do
|
21
6
|
|
@@ -48,5 +33,43 @@ if Mongoid::VERSION =~ /\A3\./
|
|
48
33
|
expect(page.updated_at).to be_within(5).of(Time.now)
|
49
34
|
end
|
50
35
|
end
|
36
|
+
|
37
|
+
context "when the parent of embedded doc has cascade callbacks" do
|
38
|
+
|
39
|
+
let!(:book) do
|
40
|
+
Book.new
|
41
|
+
end
|
42
|
+
|
43
|
+
before do
|
44
|
+
book.pages.new
|
45
|
+
book.save
|
46
|
+
book.unset(:updated_at)
|
47
|
+
book.pages.first.touch
|
48
|
+
end
|
49
|
+
|
50
|
+
it "touches the parent document" do
|
51
|
+
expect(book.updated_at).to be_within(5).of(Time.now)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context "when multiple embedded docs with cascade callbacks" do
|
56
|
+
|
57
|
+
let!(:book) do
|
58
|
+
Book.new
|
59
|
+
end
|
60
|
+
|
61
|
+
before do
|
62
|
+
2.times { book.pages.new }
|
63
|
+
book.save
|
64
|
+
book.unset(:updated_at)
|
65
|
+
book.pages.first.content = "foo"
|
66
|
+
book.pages.second.content = "bar"
|
67
|
+
book.pages.first.touch
|
68
|
+
end
|
69
|
+
|
70
|
+
it "touches the parent document" do
|
71
|
+
expect(book.updated_at).to be_within(5).of(Time.now)
|
72
|
+
end
|
73
|
+
end
|
51
74
|
end
|
52
75
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongoid_monkey
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- johnnyshields
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-02-
|
11
|
+
date: 2017-02-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -74,10 +74,14 @@ files:
|
|
74
74
|
- lib/version.rb
|
75
75
|
- spec/app/models/account.rb
|
76
76
|
- spec/app/models/address.rb
|
77
|
+
- spec/app/models/book.rb
|
77
78
|
- spec/app/models/draft.rb
|
79
|
+
- spec/app/models/edit.rb
|
78
80
|
- spec/app/models/name.rb
|
81
|
+
- spec/app/models/page.rb
|
79
82
|
- spec/app/models/person.rb
|
80
83
|
- spec/app/models/user.rb
|
84
|
+
- spec/app/models/wiki_page.rb
|
81
85
|
- spec/config/mongodb-mmapv1.conf
|
82
86
|
- spec/config/mongodb-wiredtiger.conf
|
83
87
|
- spec/gemfile/mongoid3.gemfile
|
@@ -144,10 +148,14 @@ summary: Monkey patches for Mongoid
|
|
144
148
|
test_files:
|
145
149
|
- spec/app/models/account.rb
|
146
150
|
- spec/app/models/address.rb
|
151
|
+
- spec/app/models/book.rb
|
147
152
|
- spec/app/models/draft.rb
|
153
|
+
- spec/app/models/edit.rb
|
148
154
|
- spec/app/models/name.rb
|
155
|
+
- spec/app/models/page.rb
|
149
156
|
- spec/app/models/person.rb
|
150
157
|
- spec/app/models/user.rb
|
158
|
+
- spec/app/models/wiki_page.rb
|
151
159
|
- spec/config/mongodb-mmapv1.conf
|
152
160
|
- spec/config/mongodb-wiredtiger.conf
|
153
161
|
- spec/gemfile/mongoid3.gemfile
|