prioritized_callbacks 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +8 -0
- data/lib/prioritized_callbacks/active_model/callbacks_patch.rb +4 -1
- data/lib/prioritized_callbacks/active_support/callbacks_class_methods_patch.rb +19 -2
- data/lib/prioritized_callbacks/version.rb +1 -1
- data/spec/lib/activerecord_callbacks_spec.rb +26 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 920ddd09c3a79727ca904220114d5ed4df1f2246422bf708b8ccdce47534dab1
|
4
|
+
data.tar.gz: 5d1eccf1d4632e79130cd9e388bde7f69b32e88dae781a79161b721e05adb938
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0d341ef80863b66a8c31cce8ce407f25475d88426b25c5aa0e4118742173db5939f6e12b5e82844d8242989d79d1ccab5244ce199ce99eb3af8f0577c693a6b8
|
7
|
+
data.tar.gz: 6909e13c7d26c8f4edcce63ed9a6a72530513e0ab3e8a8a9de3c32e15601fef64763aa512a0257db0401b906fe1b60f20ace242b43066bed4adade2f2262354e
|
data/README.md
CHANGED
@@ -102,4 +102,12 @@ set_callbacks_order :save, [..., :default, ...]
|
|
102
102
|
The latter can be used outside of ActiveRecord, in ActionController or ActiveModel, where ActiveSupport::Callbacks
|
103
103
|
are included.
|
104
104
|
|
105
|
+
To append the order in any inherited class:
|
106
|
+
|
107
|
+
```ruby
|
108
|
+
append_save_order :my_order, before: :default
|
109
|
+
```
|
110
|
+
|
111
|
+
You can specify `:before` or `:after` to specify a place where new order item should be inserted.
|
112
|
+
|
105
113
|
2) To set priority for specific callback, you should add `:priority` option to `before_save` or `after_save`.
|
@@ -10,7 +10,10 @@ module PrioritizedCallbacks
|
|
10
10
|
|
11
11
|
callbacks.each do |callback|
|
12
12
|
define_singleton_method "set_#{callback}_order" do |*args|
|
13
|
-
set_callbacks_order(
|
13
|
+
set_callbacks_order(callback, args)
|
14
|
+
end
|
15
|
+
define_singleton_method "append_#{callback}_order" do |*args, **options|
|
16
|
+
append_callbacks_order(callback, args, options)
|
14
17
|
end
|
15
18
|
end
|
16
19
|
end
|
@@ -1,10 +1,27 @@
|
|
1
1
|
module PrioritizedCallbacks
|
2
2
|
module ActiveSupport
|
3
3
|
module CallbacksClassMethodsPatch
|
4
|
-
def set_callbacks_order(name,
|
4
|
+
def set_callbacks_order(name, order_items)
|
5
5
|
chain = get_callbacks(name)
|
6
6
|
raise ArgumentError, "Callbacks for #{name} are not defined" unless chain
|
7
|
-
set_callbacks name, chain.copy_with_new_order(
|
7
|
+
set_callbacks name, chain.copy_with_new_order(order_items)
|
8
|
+
end
|
9
|
+
|
10
|
+
def append_callbacks_order(name, order_items, options = {})
|
11
|
+
chain = get_callbacks(name)
|
12
|
+
raise ArgumentError, "Callbacks for #{name} are not defined" unless chain
|
13
|
+
order = chain.config[:order]
|
14
|
+
insert_pos = order.size
|
15
|
+
if (before = options[:before])
|
16
|
+
insert_pos = order.index(before)
|
17
|
+
raise ArgumentError, "Order '#{before}' is not defined in #{name} callbacks" unless insert_pos
|
18
|
+
elsif (after = options[:after])
|
19
|
+
insert_pos = order.index(after)
|
20
|
+
raise ArgumentError, "Order '#{after}' is not defined in #{name} callbacks" unless insert_pos
|
21
|
+
insert_pos += 1
|
22
|
+
end
|
23
|
+
order.insert insert_pos, *order_items
|
24
|
+
set_callbacks_order name, order
|
8
25
|
end
|
9
26
|
end
|
10
27
|
end
|
@@ -87,10 +87,28 @@ RSpec.describe ActiveRecord::Callbacks do
|
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
90
|
+
class Record5 < Record2
|
91
|
+
append_save_order :final
|
92
|
+
|
93
|
+
before_save priority: :final do
|
94
|
+
self.text += 'X'
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
class Record6 < Record5
|
99
|
+
append_save_order :initial, before: :first
|
100
|
+
|
101
|
+
before_save priority: :initial do
|
102
|
+
self.text += 'Y'
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
90
106
|
let(:record1) { Record1.new.tap(&:save) }
|
91
107
|
let(:record2) { Record2.new.tap(&:save) }
|
92
108
|
let(:record3) { Record3.new.tap(&:save) }
|
93
109
|
let(:record4) { Record4.new.tap(&:save) }
|
110
|
+
let(:record5) { Record5.new.tap(&:save) }
|
111
|
+
let(:record6) { Record6.new.tap(&:save) }
|
94
112
|
|
95
113
|
it 'has default order if order is not specified' do
|
96
114
|
expect(record1.text).to eq('012934')
|
@@ -111,4 +129,12 @@ RSpec.describe ActiveRecord::Callbacks do
|
|
111
129
|
it "has proper order when around is used" do
|
112
130
|
expect(record4.text).to eq('1342')
|
113
131
|
end
|
132
|
+
|
133
|
+
it "has proper order when new order item is appended" do
|
134
|
+
expect(record5.text).to eq('1023X4956')
|
135
|
+
end
|
136
|
+
|
137
|
+
it "has proper order when new order item is appended to the beginning" do
|
138
|
+
expect(record6.text).to eq('Y1023X4956')
|
139
|
+
end
|
114
140
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: prioritized_callbacks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anton Argirov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-06-
|
11
|
+
date: 2021-06-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|