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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 67fa423205b68cba0faae8dbe2c7ae6e2d27d4e935fa8b9240368f1db1364833
4
- data.tar.gz: 684ebfffafab4bc89ff968983970c98ca5a996174f3d50307bd7b1fab56e83fb
3
+ metadata.gz: 920ddd09c3a79727ca904220114d5ed4df1f2246422bf708b8ccdce47534dab1
4
+ data.tar.gz: 5d1eccf1d4632e79130cd9e388bde7f69b32e88dae781a79161b721e05adb938
5
5
  SHA512:
6
- metadata.gz: 6150409a8dcf199c6aca6685d01b3fd8ef33b62a562ee95fcd92e578fdc05279a38f6f54b91b6ebb85b3e4e2230407acb46d2380c559120d4246668cf5f732f9
7
- data.tar.gz: 8b39d7091e40da431c89f40389ebc8d5b703b454b3219de41d64094866a54149439e6971696368f76b02a591098ae276671887838df2dce3ad9147752cac166f
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(:"#{callback}", args)
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, order)
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(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
@@ -1,3 +1,3 @@
1
1
  module PrioritizedCallbacks
2
- VERSION = '0.0.2'
2
+ VERSION = '0.0.3'
3
3
  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.2
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-02 00:00:00.000000000 Z
11
+ date: 2021-06-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport