prioritized_callbacks 0.0.2 → 0.0.3
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 +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
|