redstream 0.4.4 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e25cd9c9c13d7fe93e81207a7608599e37c72a39425b54108c7178b3e97917f3
4
- data.tar.gz: 5a5179bf6de8ef24effa908595a32bbcccd9c5c717988ce25a0f38aa128b6cab
3
+ metadata.gz: '08b45ec057fc3fa2404ff0c48c9f1befdd7dee5177b526690cb5edb907990ac7'
4
+ data.tar.gz: '081b1cbd5ed872b3d320b1ffe6e7f4342c5bfcb101b293a5cf9348241f8dfe44'
5
5
  SHA512:
6
- metadata.gz: adee0c463fb89d9f112b3bc374c25fcb7fe60819f18952133df3afe789bcbabca5fcc184d144b5dff8db747098b2c8953cb440be474d6dd1df4ed004fd1e6467
7
- data.tar.gz: 430b4df8d3095e9375320f9fbfa83aa24615bf2d6b19c2deba663fb69db3806a664dddd83c3f98f5f26b28c8de603f69d8ed926943043be905771d16595dc10e
6
+ metadata.gz: df13ccbbfe9b62e79d5dab0ac461f9c433aff8b6a2990079a4f5c007cb72e93cecf95fd65eb5aa9780da3542a95be01aa7ab83ac109b19b3af93faed69678e58
7
+ data.tar.gz: ab2e5e8cc1c2ec8b8031cd27621a53e302b1ca23b1d50accb17a348742a0cebdefbf9d92adc6f216534dfcd145262f098f128e3539fd64d57fae994e54745f5e
@@ -16,7 +16,7 @@ jobs:
16
16
  - 6379:6379
17
17
  steps:
18
18
  - uses: actions/checkout@v1
19
- - uses: actions/setup-ruby@v1
19
+ - uses: ruby/setup-ruby@v1
20
20
  with:
21
21
  ruby-version: ${{ matrix.ruby }}
22
22
  - uses: actions/cache@v1
data/CHANGELOG.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## v0.5.0
4
+ * No longer delete delay messages
5
+
3
6
  ## v0.4.4
4
7
  * Remove deletion of delay messages after queues messages are sent from `.bulk`
5
8
 
data/README.md CHANGED
@@ -97,9 +97,7 @@ any errors occurring in between `after_save` and `after_commit` result in
97
97
  inconsistencies between your primary and secondary datastore. By using these
98
98
  kinds of "delay" messages triggered by `after_save` and fetched after e.g. 5
99
99
  minutes, errors occurring in between `after_save` and `after_commit` can be
100
- fixed when the delay message get processed. Please note that redstream deletes
101
- delay messages after the messages for immediate retrieval have been
102
- successfully sent, such that messages will not be processed twice, usually.
100
+ fixed when the delay message get processed.
103
101
 
104
102
  Any messages are fetched in batches, such that e.g. elasticsearch can be
105
103
  updated using its bulk API. For instance, depending on which elasticsearch ruby
@@ -12,8 +12,6 @@ module Redstream
12
12
  # end
13
13
 
14
14
  module Model
15
- IVAR_DELAY_MESSAGE_ID = :@__redstream_delay_message_id__
16
-
17
15
  def self.included(base)
18
16
  base.extend(ClassMethods)
19
17
  end
@@ -31,20 +29,16 @@ module Redstream
31
29
  # responsible for writing to a redis stream
32
30
 
33
31
  def redstream_callbacks(producer: Producer.new)
34
- after_save { |object| instance_variable_set(IVAR_DELAY_MESSAGE_ID, producer.delay(object)) if object.saved_changes.present? }
35
- after_touch { |object| instance_variable_set(IVAR_DELAY_MESSAGE_ID, producer.delay(object)) }
36
- after_destroy { |object| instance_variable_set(IVAR_DELAY_MESSAGE_ID, producer.delay(object)) }
32
+ after_save { |object| producer.delay(object) if object.saved_changes.present? }
33
+ after_touch { |object| producer.delay(object) }
34
+ after_destroy { |object| producer.delay(object) }
37
35
 
38
36
  after_commit(on: [:create, :update]) do |object|
39
- if object.saved_changes.present?
40
- producer.queue(object, delay_message_id: instance_variable_get(IVAR_DELAY_MESSAGE_ID))
41
- instance_variable_set(IVAR_DELAY_MESSAGE_ID, nil)
42
- end
37
+ producer.queue(object) if object.saved_changes.present?
43
38
  end
44
39
 
45
40
  after_commit(on: :destroy) do |object|
46
- producer.queue(object, delay_message_id: instance_variable_get(IVAR_DELAY_MESSAGE_ID))
47
- instance_variable_set(IVAR_DELAY_MESSAGE_ID, nil)
41
+ producer.queue(object)
48
42
  end
49
43
  end
50
44
 
@@ -126,14 +126,10 @@ module Redstream
126
126
  # Writes a single message to a stream in redis for immediate retrieval.
127
127
  #
128
128
  # @param object The object hat will be updated, deleted, etc.
129
- # @param delay_message_id The delay message id to delete
130
129
 
131
- def queue(object, delay_message_id: nil)
130
+ def queue(object)
132
131
  Redstream.connection_pool.with do |redis|
133
- redis.pipelined do |pipeline|
134
- pipeline.xadd(Redstream.stream_key_name(stream_name(object)), { payload: JSON.dump(object.redstream_payload) })
135
- pipeline.xdel(Redstream.stream_key_name("#{stream_name(object)}.delay"), delay_message_id) if delay_message_id
136
- end
132
+ redis.xadd(Redstream.stream_key_name(stream_name(object)), { payload: JSON.dump(object.redstream_payload) })
137
133
  end
138
134
 
139
135
  true
@@ -1,3 +1,3 @@
1
1
  module Redstream
2
- VERSION = "0.4.4"
2
+ VERSION = "0.5.0"
3
3
  end
@@ -8,12 +8,6 @@ RSpec.describe Redstream::Model do
8
8
  end
9
9
  end
10
10
 
11
- it "assigns the delay message id" do
12
- Product.transaction do
13
- expect(create(:product).instance_variable_get(Redstream::Model::IVAR_DELAY_MESSAGE_ID)).to be_present
14
- end
15
- end
16
-
17
11
  it "adds the correct payload for the delay message" do
18
12
  Product.transaction do
19
13
  product = create(:product)
@@ -26,13 +20,6 @@ RSpec.describe Redstream::Model do
26
20
  expect { create(:product) }.to change { redis.xlen(Redstream.stream_key_name("products")) }
27
21
  end
28
22
 
29
- it "deletes the delay message on commit" do
30
- product = create(:product)
31
-
32
- expect(redis.xlen(Redstream.stream_key_name("products.delay"))).to eq(0)
33
- expect(product.instance_variable_get(Redstream::Model::IVAR_DELAY_MESSAGE_ID)).to be_nil
34
- end
35
-
36
23
  it "does not add a delay message after_save if there are no changes" do
37
24
  product = create(:product)
38
25
 
@@ -55,16 +42,6 @@ RSpec.describe Redstream::Model do
55
42
  end
56
43
  end
57
44
 
58
- it "assigns the delay message id" do
59
- product = create(:product)
60
-
61
- Product.transaction do
62
- product.touch
63
-
64
- expect(product.instance_variable_get(Redstream::Model::IVAR_DELAY_MESSAGE_ID)).to be_present
65
- end
66
- end
67
-
68
45
  it "sets the correct payload for the delay message" do
69
46
  product = create(:product)
70
47
 
@@ -80,14 +57,6 @@ RSpec.describe Redstream::Model do
80
57
 
81
58
  expect { product.touch }.to change { redis.xlen(Redstream.stream_key_name("products")) }
82
59
  end
83
-
84
- it "deletes the delay message after touch on commit" do
85
- product = create(:product)
86
- product.touch
87
-
88
- expect(redis.xlen(Redstream.stream_key_name("products.delay"))).to eq(0)
89
- expect(product.instance_variable_get(Redstream::Model::IVAR_DELAY_MESSAGE_ID)).to be_nil
90
- end
91
60
  end
92
61
 
93
62
  describe "after_destroy" do
@@ -99,16 +68,6 @@ RSpec.describe Redstream::Model do
99
68
  end
100
69
  end
101
70
 
102
- it "assigns the delay message id" do
103
- product = create(:product)
104
-
105
- Product.transaction do
106
- product.destroy
107
-
108
- expect(product.instance_variable_get(Redstream::Model::IVAR_DELAY_MESSAGE_ID)).to be_present
109
- end
110
- end
111
-
112
71
  it "sets the correct payload for the delay message" do
113
72
  product = create(:product)
114
73
 
@@ -124,13 +83,5 @@ RSpec.describe Redstream::Model do
124
83
 
125
84
  expect { product.destroy }.to change { redis.xlen(Redstream.stream_key_name("products")) }.by(1)
126
85
  end
127
-
128
- it "deletes the delay message after destroy on commit" do
129
- product = create(:product)
130
- product.destroy
131
-
132
- expect(redis.xlen(Redstream.stream_key_name("products.delay"))).to eq(0)
133
- expect(product.instance_variable_get(Redstream::Model::IVAR_DELAY_MESSAGE_ID)).to be_nil
134
- end
135
86
  end
136
87
  end
@@ -10,17 +10,6 @@ RSpec.describe Redstream::Producer do
10
10
  expect { Redstream::Producer.new.queue(product) }.to change { redis.xlen(stream_key_name) }.by(1)
11
11
  expect(redis.xrange(stream_key_name, "-", "+").last[1]).to eq("payload" => JSON.dump(product.redstream_payload))
12
12
  end
13
-
14
- it "deletes the delay message when given" do
15
- product = create(:product)
16
-
17
- producer = Redstream::Producer.new
18
-
19
- id = producer.delay(product)
20
- producer.queue(product, delay_message_id: id)
21
-
22
- expect(redis.xlen(Redstream.stream_key_name("products.delay"))).to eq(0)
23
- end
24
13
  end
25
14
 
26
15
  describe "#delay" do
@@ -48,9 +37,11 @@ RSpec.describe Redstream::Producer do
48
37
 
49
38
  stream_key_name = Redstream.stream_key_name("products")
50
39
 
51
- expect(redis.xlen("#{stream_key_name}.delay")).to eq(0)
40
+ expect(redis.xlen("#{stream_key_name}.delay")).to eq(2)
52
41
 
53
42
  Redstream::Producer.new.bulk(Product.all) do
43
+ expect(redis.xlen("#{stream_key_name}.delay")).to eq(4)
44
+
54
45
  messages = redis.xrange("#{stream_key_name}.delay", "-", "+").last(2).map { |message| message[1] }
55
46
 
56
47
  expect(messages).to eq([
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redstream
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.4
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Benjamin Vetter
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-09-12 00:00:00.000000000 Z
11
+ date: 2022-11-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord