ruby_nest_nats 0.2.1 → 0.2.2

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: 8ff7ec8086e242612ea12d75ef5a8a52330b8f84d3cd12bc097be093b00ef5c7
4
- data.tar.gz: aae8c3e437f6c94abf4f3c4a551efd009308b0702a064c848e8935ee8087a01f
3
+ metadata.gz: 115d647c8fddd551ecd29db19c99ecc6ee958b80406322141d9773219dd24345
4
+ data.tar.gz: b000384383eef9cf1f484195115aba6ef9bb4727b5baa852a818006a8bbbf876
5
5
  SHA512:
6
- metadata.gz: 49f30461903b281191bbd2aa1cfd2d579416b355b0d1f5c5abef3b42057b99a66989a33d8995318bf1c57d66ec4528d8e97f411759dba2cf5d74187d28060120
7
- data.tar.gz: 73a64ce207bce9fcb050d535eb21a10ff561da69d328c4a3ebd4cbee6d9a5705f675d0bdbf086f9cffd31eb9a57691de001004a75be3b0cab7149b0744c630e4
6
+ metadata.gz: dbe204fb29c5acc514ff48c026ce34f93e297bcaebceb5e6fade77512e373e2a722b733dc92ac8e5b1228cf9e551f138659ad7511e6ff8a7d9d23740a0e91e74
7
+ data.tar.gz: 3f2b68a7473b4facddbc954aae0fd38b5d0a1e9b2a72adfd69415a1e7ec712a4d2723a04935d9a30aa25aa83aa681262149aab3047da3d26333d2e98125834fe
data/README.md CHANGED
@@ -62,7 +62,7 @@ docker run -p 4222:4222 -p 8222:8222 -p 6222:6222 -ti nats:latest
62
62
 
63
63
  Attach a logger to have `ruby_nest_nats` write out logs for messages received, responses sent, errors raised, lifecycle events, etc.
64
64
 
65
- ```rb
65
+ ```ruby
66
66
  require 'ruby_nest_nats'
67
67
  require 'logger'
68
68
 
@@ -74,7 +74,7 @@ RubyNestNats::Client.logger = nats_logger
74
74
 
75
75
  In a Rails application, you might do this instead:
76
76
 
77
- ```rb
77
+ ```ruby
78
78
  RubyNestNats::Client.logger = Rails.logger
79
79
  ```
80
80
 
@@ -93,13 +93,13 @@ The following will be logged at the specified log levels
93
93
 
94
94
  Set a default queue for subscriptions.
95
95
 
96
- ```rb
96
+ ```ruby
97
97
  RubyNestNats::Client.default_queue = "foobar"
98
98
  ```
99
99
 
100
100
  Leave the `::default_queue` blank (or assign `nil`) to use no default queue.
101
101
 
102
- ```rb
102
+ ```ruby
103
103
  RubyNestNats::Client.default_queue = nil
104
104
  ```
105
105
 
@@ -111,7 +111,7 @@ Register a message handler with the `RubyNestNats::Client::reply_to` method. Pas
111
111
 
112
112
  The result of the given block will be published in reply to the message. The block is passed two arguments when a message matching the subject is received: `data` and `subject`. The `data` argument is the payload of the message (JSON objects/arrays will be parsed into string-keyed `Hash` objects/`Array` objects, respectively). The `subject` argument is the subject of the message received (mostly only useful if a _pattern_ was specified instead of a static subject string).
113
113
 
114
- ```rb
114
+ ```ruby
115
115
  RubyNestNats::Client.reply_to("some.subject", queue: "foobar") { |data| "Got it! #{data.inspect}" }
116
116
 
117
117
  RubyNestNats::Client.reply_to("some.*.pattern") { |data, subject| "Got #{data} on #{subject}" }
@@ -133,7 +133,7 @@ end
133
133
 
134
134
  Start listening for messages with the `RubyNestNats::Client::start!` method. This will spin up a non-blocking thread that subscribes to subjects (as specified by invocation(s) of `::reply_to`) and waits for messages to come in. When a message is received, the appropriate `::reply_to` block will be used to compute a response, and that response will be published.
135
135
 
136
- ```rb
136
+ ```ruby
137
137
  RubyNestNats::Client.start!
138
138
  ```
139
139
 
@@ -149,7 +149,7 @@ The following should be enough to start a `ruby_nest_nats` setup in your Ruby ap
149
149
 
150
150
  > **NOTE:** For a more organized structure and implementation in a larger app (like a Rails project), see the ["controller" section below](#controller-section).
151
151
 
152
- ```rb
152
+ ```ruby
153
153
  require 'ruby_nest_nats'
154
154
  require 'logger'
155
155
 
@@ -178,7 +178,7 @@ Use the `::subject` macro to create a block for listening to that subject segmen
178
178
 
179
179
  You can register a response for the built-up subject/pattern string using the `::response` macro. Pass a block to `::response` which optionally takes two arguments ([the same arguments supplied to the block of `RubyNestNats::Client::reply_to`](#reply-to-section)). The result of that block will be sent as a response to the message received.
180
180
 
181
- ```rb
181
+ ```ruby
182
182
  class HelloController < RubyNestNats::Controller
183
183
  default_queue "foobar"
184
184
 
@@ -228,7 +228,7 @@ end
228
228
  >
229
229
  > For example: in a Rails project (assuming you have your NATS controllers in a directory called `app/nats/`), you may want to put something like the following in an initializer (such as `config/initializers/nats.rb`):
230
230
  >
231
- > ```rb
231
+ > ```ruby
232
232
  > RubyNestNats::Client.logger = Rails.logger
233
233
  > RubyNestNats::Client.default_queue = "foobar"
234
234
  >
@@ -6,10 +6,12 @@ require_relative "ruby_nest_nats/utils"
6
6
  require_relative "ruby_nest_nats/client"
7
7
  require_relative "ruby_nest_nats/controller"
8
8
 
9
- # The `RubyNestNats` module provides the top-level namespace for the NATS client
9
+ # The +RubyNestNats+ module provides the top-level namespace for the NATS client
10
10
  # and controller machinery.
11
11
  module RubyNestNats
12
- class Error < StandardError; end # :nodoc:
12
+ # :nodoc:
13
+ class Error < StandardError; end
13
14
 
14
- class NewSubscriptionsError < RubyNestNats::Error; end # :nodoc:
15
+ # :nodoc:
16
+ class NewSubscriptionsError < RubyNestNats::Error; end
15
17
  end
@@ -5,31 +5,30 @@ require "nats/client"
5
5
  require_relative "./utils"
6
6
 
7
7
  module RubyNestNats
8
- # The `RubyNestNats::Client` class provides a basic interface for subscribing
8
+ # The +RubyNestNats::Client+ class provides a basic interface for subscribing
9
9
  # to messages by subject & queue, and replying to those messages. It also logs
10
10
  # most functionality if desired.
11
11
  class Client
12
12
  class << self
13
- attr_reader :logger, :default_queue # :nodoc:
13
+ # :nodoc:
14
+ attr_reader :logger, :default_queue
14
15
 
15
- # Attach a logger to have `ruby_nest_nats` write out logs for messages
16
+ # Attach a logger to have +ruby_nest_nats+ write out logs for messages
16
17
  # received, responses sent, errors raised, lifecycle events, etc.
17
18
  #
18
- # ```rb
19
- # require 'ruby_nest_nats'
20
- # require 'logger'
19
+ # @example
20
+ # require 'ruby_nest_nats'
21
+ # require 'logger'
21
22
  #
22
- # nats_logger = Logger.new(STDOUT)
23
- # nats_logger.level = Logger::INFO
23
+ # nats_logger = Logger.new(STDOUT)
24
+ # nats_logger.level = Logger::INFO
24
25
  #
25
- # RubyNestNats::Client.logger = nats_logger
26
- # ```
26
+ # RubyNestNats::Client.logger = nats_logger
27
27
  #
28
28
  # In a Rails application, you might do this instead:
29
29
  #
30
- # ```rb
31
- # RubyNestNats::Client.logger = Rails.logger
32
- # ```
30
+ # @example
31
+ # RubyNestNats::Client.logger = Rails.logger
33
32
  #
34
33
  def logger=(some_logger)
35
34
  log("Setting the logger to #{some_logger.inspect}")
@@ -38,16 +37,14 @@ module RubyNestNats
38
37
 
39
38
  # Set a default queue for subscriptions.
40
39
  #
41
- # ```rb
42
- # RubyNestNats::Client.default_queue = "foobar"
43
- # ```
40
+ # @example
41
+ # RubyNestNats::Client.default_queue = "foobar"
44
42
  #
45
- # Leave the `::default_queue` blank (or assign `nil`) to use no default
43
+ # Leave the +::default_queue+ blank (or assign +nil+) to use no default
46
44
  # queue.
47
45
  #
48
- # ```rb
49
- # RubyNestNats::Client.default_queue = nil
50
- # ```
46
+ # @example
47
+ # RubyNestNats::Client.default_queue = nil
51
48
  #
52
49
  def default_queue=(some_queue)
53
50
  queue = Utils.presence(some_queue.to_s)
@@ -55,52 +52,51 @@ module RubyNestNats
55
52
  @default_queue = queue
56
53
  end
57
54
 
58
- # Returns `true` if `::start!` has already been called (meaning the client
59
- # is listening to NATS messages). Returns `false` if it has not yet been
55
+ # Returns +true+ if +::start!+ has already been called (meaning the client
56
+ # is listening to NATS messages). Returns +false+ if it has not yet been
60
57
  # called, or if it has been stopped.
61
58
  def started?
62
59
  @started ||= false
63
60
  end
64
61
 
65
- # Opposite of `::started?`: returns `false` if `::start!` has already been
62
+ # Opposite of +::started?+: returns +false+ if +::start!+ has already been
66
63
  # called (meaning the client is listening to NATS messages). Returns
67
- # `true` if it has not yet been called, or if it has been stopped.
64
+ # +true+ if it has not yet been called, or if it has been stopped.
68
65
  def stopped?
69
66
  !started?
70
67
  end
71
68
 
72
- # Register a message handler with the `RubyNestNats::Client::reply_to`
69
+ # Register a message handler with the +RubyNestNats::Client::reply_to+
73
70
  # method. Pass a subject string as the first argument (either a static
74
71
  # subject string or a pattern to match more than one subject). Specify a
75
- # queue (or don't) with the `queue:` option. If you don't provide the
76
- # `queue:` option, it will be set to the value of `default_queue`, or to
77
- # `nil` (no queue) if a default queue hasn't been set.
72
+ # queue (or don't) with the +queue:+ option. If you don't provide the
73
+ # +queue:+ option, it will be set to the value of +default_queue+, or to
74
+ # +nil+ (no queue) if a default queue hasn't been set.
78
75
  #
79
76
  # The result of the given block will be published in reply to the message.
80
77
  # The block is passed two arguments when a message matching the subject is
81
- # received: `data` and `subject`. The `data` argument is the payload of
82
- # the message (JSON objects/arrays will be parsed into string-keyed `Hash`
83
- # objects/`Array` objects, respectively). The `subject` argument is the
78
+ # received: +data+ and +subject+. The +data+ argument is the payload of
79
+ # the message (JSON objects/arrays will be parsed into string-keyed +Hash+
80
+ # objects/+Array+ objects, respectively). The +subject+ argument is the
84
81
  # subject of the message received (mostly only useful if a _pattern_ was
85
82
  # specified instead of a static subject string).
86
83
  #
87
- # ```rb
88
- # RubyNestNats::Client.reply_to("some.subject", queue: "foobar") { |data| "Got it! #{data.inspect}" }
84
+ # @example
85
+ # RubyNestNats::Client.reply_to("some.subject", queue: "foobar") { |data| "Got it! #{data.inspect}" }
89
86
  #
90
- # RubyNestNats::Client.reply_to("some.*.pattern") { |data, subject| "Got #{data} on #{subject}" }
87
+ # RubyNestNats::Client.reply_to("some.*.pattern") { |data, subject| "Got #{data} on #{subject}" }
91
88
  #
92
- # RubyNestNats::Client.reply_to("other.subject") do |data|
93
- # if data["foo"] == "bar"
94
- # { is_bar: "Yep!" }
95
- # else
96
- # { is_bar: "No way!" }
89
+ # RubyNestNats::Client.reply_to("other.subject") do |data|
90
+ # if data["foo"] == "bar"
91
+ # { is_bar: "Yep!" }
92
+ # else
93
+ # { is_bar: "No way!" }
94
+ # end
97
95
  # end
98
- # end
99
96
  #
100
- # RubyNestNats::Client.reply_to("subject.in.queue", queue: "barbaz") do
101
- # "My turn!"
102
- # end
103
- # ```
97
+ # RubyNestNats::Client.reply_to("subject.in.queue", queue: "barbaz") do
98
+ # "My turn!"
99
+ # end
104
100
  #
105
101
  def reply_to(subject, queue: nil, &block)
106
102
  queue = Utils.presence(queue) || default_queue
@@ -109,34 +105,33 @@ module RubyNestNats
109
105
  register_reply!(subject: subject.to_s, handler: block, queue: queue.to_s)
110
106
  end
111
107
 
112
- # Start listening for messages with the `RubyNestNats::Client::start!`
108
+ # Start listening for messages with the +RubyNestNats::Client::start!+
113
109
  # method. This will spin up a non-blocking thread that subscribes to
114
- # subjects (as specified by invocation(s) of `::reply_to`) and waits for
110
+ # subjects (as specified by invocation(s) of +::reply_to+) and waits for
115
111
  # messages to come in. When a message is received, the appropriate
116
- # `::reply_to` block will be used to compute a response, and that response
112
+ # +::reply_to+ block will be used to compute a response, and that response
117
113
  # will be published.
118
114
  #
119
- # ```rb
120
- # RubyNestNats::Client.start!
121
- # ```
115
+ # @example
116
+ # RubyNestNats::Client.start!
122
117
  #
123
118
  # **NOTE:** If an error is raised in one of the handlers,
124
- # `RubyNestNats::Client` will restart automatically.
119
+ # +RubyNestNats::Client+ will restart automatically.
125
120
  #
126
- # **NOTE:** You _can_ invoke `::reply_to` to create additional message
127
- # subscriptions after `RubyNestNats::Client.start!`, but be aware that
121
+ # **NOTE:** You _can_ invoke +::reply_to+ to create additional message
122
+ # subscriptions after +RubyNestNats::Client.start!+, but be aware that
128
123
  # this forces the client to restart. You may see (benign, already-handled)
129
124
  # errors in the logs generated when this restart happens. It will force
130
125
  # the client to restart and re-subscribe after _each additional
131
- # `::reply_to` invoked after `::start!`._ So, if you have a lot of
132
- # additional `::reply_to` invocations, you may want to consider
133
- # refactoring so that your call to `RubyNestNats::Client.start!` occurs
126
+ # +::reply_to+ invoked after +::start!+._ So, if you have a lot of
127
+ # additional +::reply_to+ invocations, you may want to consider
128
+ # refactoring so that your call to +RubyNestNats::Client.start!+ occurs
134
129
  # _after_ those additions.
135
130
  #
136
- # **NOTE:** The `::start!` method can be safely called multiple times;
137
- # only the first will be honored, and any subsequent calls to `::start!`
131
+ # **NOTE:** The +::start!+ method can be safely called multiple times;
132
+ # only the first will be honored, and any subsequent calls to +::start!+
138
133
  # after the client is already started will do nothing (except write a
139
- # _"NATS is already running"_ log to the logger at the `DEBUG` level).
134
+ # _"NATS is already running"_ log to the logger at the +DEBUG+ level).
140
135
  #
141
136
  def start!
142
137
  log("Starting NATS", level: :debug)
@@ -3,38 +3,38 @@
3
3
  require_relative "./utils"
4
4
 
5
5
  module RubyNestNats
6
- # Create controller classes which inherit from `RubyNestNats::Controller` in
6
+ # Create controller classes which inherit from +RubyNestNats::Controller+ in
7
7
  # order to give your message listeners some structure.
8
8
  class Controller
9
+ # :nodoc:
9
10
  NO_QUEUE_GIVEN = :ruby_nest_nats_super_special_no_op_queue_symbol_qwertyuiop1234567890
10
11
 
11
12
  class << self
12
13
  # Default queue for the controller. Falls back to the client's default
13
- # queue if the controller's default queue is `nil`.
14
+ # queue if the controller's default queue is +nil+.
14
15
  #
15
- # - Call with no argument (`::default_queue`) to get the default queue.
16
- # - Call as a macro with an argument (`default_queue "something"`) to set
16
+ # - Call with no argument (+::default_queue+) to get the default queue.
17
+ # - Call as a macro with an argument (+default_queue "something"+) to set
17
18
  # the default queue.
18
19
  #
19
- # Example:
20
+ # @example
21
+ # class FoobarNatsController < RubyNatsController
22
+ # default_queue "foobar"
20
23
  #
21
- # class FoobarNatsController < RubyNatsController
22
- # default_queue "foobar"
23
- #
24
- # # ...
25
- # end
24
+ # # ...
25
+ # end
26
26
  #
27
27
  # If omitted, the controller will fall back on the global default queue
28
- # assigned with `RubyNestNats::Client::default_queue=`. If no default
28
+ # assigned with +RubyNestNats::Client::default_queue=+. If no default
29
29
  # queue is set in either the controller or globally, then the default
30
- # queue will be blank. Set the default queue to `nil` in a controller to
30
+ # queue will be blank. Set the default queue to +nil+ in a controller to
31
31
  # override the global default queue and explicitly make the default queue
32
32
  # blank for that controller.
33
33
  #
34
34
  def default_queue(some_queue = NO_QUEUE_GIVEN)
35
- # `NO_QUEUE_GIVEN` is a special symbol (rather than `nil`) so that the
36
- # default queue can be "unset" to `nil` (given a non-`nil` global
37
- # default set with `RubyNestNats::Client::default_queue=`).
35
+ # +NO_QUEUE_GIVEN+ is a special symbol (rather than +nil+) so that the
36
+ # default queue can be "unset" to +nil+ (given a non-+nil+ global
37
+ # default set with +RubyNestNats::Client::default_queue=+).
38
38
  if some_queue == NO_QUEUE_GIVEN
39
39
  @default_queue || Client.default_queue
40
40
  else
@@ -42,54 +42,52 @@ module RubyNestNats
42
42
  end
43
43
  end
44
44
 
45
- # Use the `::subject` macro to create a block for listening to that
46
- # subject segment. Nested calls to `::subject` will append each subsequent
45
+ # Use the +::subject+ macro to create a block for listening to that
46
+ # subject segment. Nested calls to +::subject+ will append each subsequent
47
47
  # subject/pattern string to the last (joined by a periods). There is no
48
48
  # limit to the level of nesting.
49
49
  #
50
50
  # **NOTE:** The following two examples do exactly the same thing.
51
51
  #
52
- # Example:
52
+ # @example
53
+ # class FoobarNatsController < RubyNatsController
54
+ # # ...
55
+ #
56
+ # subject "hello.wassup" do
57
+ # response do |data, subject|
58
+ # # The subject at this point is "hello.wassup"
59
+ # # ...
60
+ # end
61
+ # end
62
+ #
63
+ # subject "hello.howdy" do
64
+ # response do |data, subject|
65
+ # # The subject at this point is "hello.howdy"
66
+ # # ...
67
+ # end
68
+ # end
69
+ # end
53
70
  #
54
- # class FoobarNatsController < RubyNatsController
55
- # # ...
71
+ # @example
72
+ # class FoobarNatsController < RubyNatsController
73
+ # # ...
56
74
  #
57
- # subject "hello.wassup" do
75
+ # subject "hello" do
76
+ # subject "wassup" do
58
77
  # response do |data, subject|
59
78
  # # The subject at this point is "hello.wassup"
60
79
  # # ...
61
80
  # end
62
81
  # end
63
82
  #
64
- # subject "hello.howdy" do
83
+ # subject "howdy" do
65
84
  # response do |data, subject|
66
85
  # # The subject at this point is "hello.howdy"
67
86
  # # ...
68
87
  # end
69
88
  # end
70
89
  # end
71
- #
72
- # Example:
73
- #
74
- # class FoobarNatsController < RubyNatsController
75
- # # ...
76
- #
77
- # subject "hello" do
78
- # subject "wassup" do
79
- # response do |data, subject|
80
- # # The subject at this point is "hello.wassup"
81
- # # ...
82
- # end
83
- # end
84
- #
85
- # subject "howdy" do
86
- # response do |data, subject|
87
- # # The subject at this point is "hello.howdy"
88
- # # ...
89
- # end
90
- # end
91
- # end
92
- # end
90
+ # end
93
91
  #
94
92
  def subject(subject_segment, queue: nil)
95
93
  subject_chain.push(subject_segment)
@@ -101,38 +99,37 @@ module RubyNestNats
101
99
  end
102
100
 
103
101
  # You can register a response for the built-up subject/pattern string
104
- # using the `::response` macro. Pass a block to `::response` which
102
+ # using the +::response+ macro. Pass a block to +::response+ which
105
103
  # optionally takes two arguments (the same arguments supplied to the block
106
- # of `RubyNestNats::Client::reply_to`). The result of that block will be
104
+ # of +RubyNestNats::Client::reply_to+). The result of that block will be
107
105
  # sent as a response to the message received.
108
106
  #
109
- # Example:
110
- #
111
- # class FoobarNatsController < RubyNatsController
112
- # # ...
107
+ # @example
108
+ # class FoobarNatsController < RubyNatsController
109
+ # # ...
113
110
  #
114
- # subject "hello" do
115
- # subject "wassup" do
116
- # response do |data, subject|
117
- # # The subject at this point is "hello.wassup".
118
- # # Assume the message sent a JSON payload of {"name":"Bob"}
119
- # # in this example.
120
- # # We'll reply with a string response:
121
- # "I'm all right, #{data['name']}"
122
- # end
111
+ # subject "hello" do
112
+ # subject "wassup" do
113
+ # response do |data, subject|
114
+ # # The subject at this point is "hello.wassup".
115
+ # # Assume the message sent a JSON payload of {"name":"Bob"}
116
+ # # in this example.
117
+ # # We'll reply with a string response:
118
+ # "I'm all right, #{data['name']}"
123
119
  # end
120
+ # end
124
121
  #
125
- # subject "howdy" do
126
- # response do |data, subject|
127
- # # The subject at this point is "hello.howdy".
128
- # # Assume the message sent a JSON payload of {"name":"Bob"}
129
- # # in this example.
130
- # # We'll reply with a JSON response (a Ruby `Hash`):
131
- # { message: "I'm okay, #{data['name']}. Thanks for asking!" }
132
- # end
122
+ # subject "howdy" do
123
+ # response do |data, subject|
124
+ # # The subject at this point is "hello.howdy".
125
+ # # Assume the message sent a JSON payload of {"name":"Bob"}
126
+ # # in this example.
127
+ # # We'll reply with a JSON response (a Ruby +Hash+):
128
+ # { message: "I'm okay, #{data['name']}. Thanks for asking!" }
133
129
  # end
134
130
  # end
135
131
  # end
132
+ # end
136
133
  #
137
134
  def response(queue: nil, &block)
138
135
  response_queue = Utils.presence(queue.to_s) || current_queue || default_queue
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RubyNestNats
4
- class Utils # :nodoc:
4
+ # :nodoc:
5
+ class Utils
5
6
  class << self
6
7
  def blank?(value)
7
8
  value.respond_to?(:empty?) ? value.empty? : !value
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RubyNestNats
4
- VERSION = "0.2.1"
4
+ VERSION = "0.2.2"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_nest_nats
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Keegan Leitz