standard-procedure-plumbing 0.3.0 → 0.3.1

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: 245665ccd98b92e9b49ae532c7efb1edb155b895e6db935cee4de16d8039a96c
4
- data.tar.gz: 0a2b802e5e09dbc6f08259f0812c03bdb869002d90e04d5186f2ee716081ae44
3
+ metadata.gz: 9a111ce599942b5e33b6928cede476b75e56fd6574625bf50ca82d6d75f3e718
4
+ data.tar.gz: b1b4c48062aec9d77ec3b917c25723fae8ff2cc4075d9f91c699da3f165b7c84
5
5
  SHA512:
6
- metadata.gz: 84678167d2319c1e6af1a502485351ec3cb5decc4a6313396a89503e0f04a52803062081eec15fafdf30b55b93ce5bf8cbd6109d4a4872feabeb78fd2d9c959a
7
- data.tar.gz: 6a49385767a68aa48c44d110016312563b6517963fd7b338d3b6b0d2106b759d1dc22bd324bec573b3e2b4b1b57aa4dfbc2df19b6ce71e71ed0a51666e3bc3c0
6
+ metadata.gz: 6d2de706d57ef380e67fcd9d79b3d202ca0741f7ed24552ad62bc63944f1c0a82cdd6123560a6d79a85099218db5c9c966ee602a0ef281ea7d5b0305e1f5a707
7
+ data.tar.gz: 47de86307b817c0d0399bc06bcac5f78eea3629b93725b785f1dc6a442a300a03ceadde6627f2d198ea296524f584f29a90fa3ec52e5e635507c024241fec5da
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## [0.3.1] - 2024-09-03
2
+
3
+ - Added `ignore_result` for queries on Plumbing::Valves
4
+
1
5
  ## [0.3.0] - 2024-08-28
2
6
 
3
7
  - Added Plumbing::Valve
data/README.md CHANGED
@@ -156,7 +156,12 @@ An [actor](https://en.wikipedia.org/wiki/Actor_model) defines the messages an ob
156
156
 
157
157
  [Plumbing::Valve](/lib/plumbing/valve.rb) ensures that all messages received are channelled into a concurrency-safe queue. This allows you to take an existing class and ensures that messages received via its public API are made concurrency-safe.
158
158
 
159
- Include the Plumbing::Valve module into your class, define the messages the objects can respond to and set the `Plumbing` configuration to set the desired concurrency model. Messages themselves are split into two categories: commands and queries. Commands have no return value so when the message is sent, the caller does not block and execution continues immediately. Queries return a value so the caller must block until the actor has returned a value.
159
+ Include the Plumbing::Valve module into your class, define the messages the objects can respond to and set the `Plumbing` configuration to set the desired concurrency model. Messages themselves are split into two categories: commands and queries.
160
+
161
+ - Commands have no return value so when the message is sent, the caller does not block, the task is called asynchronously and the caller continues immediately
162
+ - Queries return a value so the caller blocks until the actor has returned a value
163
+ - However, if you call a query and pass `ignore_result: true` then the query will not block, although you will not be able to access the return value - this is for commands that do something and then return a result based on that work (which you may or may not be interested in - see Plumbing::Pipe#add_observer)
164
+ - None of the above applies if the `Plumbing mode` is set to `:inline` (which is the default) - in this case, the actor behaves like normal ruby code
160
165
 
161
166
  Instead of constructing your object with `.new`, use `.start`. This builds a proxy object that wraps the target instance and dispatches messages through a safe mechanism. Only messages that have been defined as part of the valve are available in this proxy - so you don't have to worry about callers bypassing the valve's internal context.
162
167
 
@@ -175,7 +180,7 @@ Also be aware that if you use valves in one place, you need to use them everywhe
175
180
  attr_reader :name, :job_title
176
181
 
177
182
  include Plumbing::Valve
178
- query :name, :job_title
183
+ query :name, :job_title, :greet_slowly
179
184
  command :promote
180
185
 
181
186
  def initialize(name)
@@ -187,6 +192,11 @@ Also be aware that if you use valves in one place, you need to use them everywhe
187
192
  sleep 0.5
188
193
  @job_title = "Sales manager"
189
194
  end
195
+
196
+ def greet_slowly
197
+ sleep 0.2
198
+ "H E L L O"
199
+ end
190
200
  end
191
201
  ```
192
202
 
@@ -206,6 +216,12 @@ Also be aware that if you use valves in one place, you need to use them everywhe
206
216
  # this will block for 0.5 seconds
207
217
  puts @person.job_title
208
218
  # => "Sales manager"
219
+
220
+ @person.greet_slowly
221
+ # this will block for 0.2 seconds before returning "H E L L O"
222
+
223
+ @person.greet_slowly(ignore_result: true)
224
+ # this will block for 0.2 seconds (as the mode is :inline) before returning nil
209
225
  ```
210
226
 
211
227
  [Using fibers](/spec/examples/valve_spec.rb) with concurrency but no parallelism
@@ -226,6 +242,12 @@ Also be aware that if you use valves in one place, you need to use them everywhe
226
242
  # this will return immediately without blocking
227
243
  puts @person.job_title
228
244
  # => "Sales manager" (this will block for 0.5s because #job_title query will not start until the #promote command has completed)
245
+
246
+ @person.greet_slowly
247
+ # this will block for 0.2 seconds before returning "H E L L O"
248
+
249
+ @person.greet_slowly(ignore_result: true)
250
+ # this will not block and returns nil
229
251
  ```
230
252
 
231
253
  ## Plumbing::Pipe - a composable observer
@@ -0,0 +1 @@
1
+ 966c4bcf848d26272cf0b3bb3d74c9724aa9899a8bcbf5e25a6ce20608de1f529dc766056aa0cb99fbe1c7d6e16afe72acbcc0619fc14f57f01eb7921be7b653
@@ -30,6 +30,7 @@ module Plumbing
30
30
  rescue
31
31
  nil
32
32
  end
33
+ nil
33
34
  end
34
35
 
35
36
  private
@@ -13,6 +13,7 @@ module Plumbing
13
13
  # Tell the target to execute the given message
14
14
  def tell(message, ...)
15
15
  @target.send(message, ...)
16
+ nil
16
17
  end
17
18
  end
18
19
  end
@@ -51,8 +51,8 @@ module Plumbing
51
51
  def build_proxy_class
52
52
  Class.new(proxy_base_class).tap do |proxy_class|
53
53
  queries.each do |query|
54
- proxy_class.define_method query do |*args, **params, &block|
55
- ask(query, *args, **params, &block)
54
+ proxy_class.define_method query do |*args, ignore_result: false, **params, &block|
55
+ ignore_result ? tell(query, *args, **params, &block) : ask(query, *args, **params, &block)
56
56
  end
57
57
  end
58
58
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Plumbing
4
- VERSION = "0.3.0"
4
+ VERSION = "0.3.1"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: standard-procedure-plumbing
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rahoul Baruah
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-08-28 00:00:00.000000000 Z
11
+ date: 2024-09-03 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A composable event pipeline and sequential pipelines of operations
14
14
  email:
@@ -33,6 +33,7 @@ files:
33
33
  - checksums/standard-procedure-plumbing-0.2.1.gem.sha512
34
34
  - checksums/standard-procedure-plumbing-0.2.2.gem.sha512
35
35
  - checksums/standard-procedure-plumbing-0.3.0.gem.sha512
36
+ - checksums/standard-procedure-plumbing-0.3.1.gem.sha512
36
37
  - lib/plumbing.rb
37
38
  - lib/plumbing/config.rb
38
39
  - lib/plumbing/custom_filter.rb