boom_nats 0.1.0 → 0.1.4

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: 4cfa0a64dc828e73223219cc03f643f20b278358f17214cf93acc4305a53b3e0
4
- data.tar.gz: 83c1f75ecda6bb93a629cdd7d1ea47ee78ea173618c62846f8d290335bc95f2a
3
+ metadata.gz: 240377b01a1661ec8dc00f36e3d5eddc80abae070ac7f82524ba299906773708
4
+ data.tar.gz: '0944ef91d75ee03479fef1efa3719f5040b534ec167ccf40796f7188672f17e2'
5
5
  SHA512:
6
- metadata.gz: 3c3b9d9a8b70867d1a0530c2addd6fb715023127a21e9c96b1c87187dd6e9213585e813bf61972f2dba2d78df7f8271b159b610d559272783bbc8f285e185aed
7
- data.tar.gz: 0c01d74a16b7489d4090cd423666d7409f423da1b874d441472f63ef9859f9682bb5dbf9392032371340a43691e25b184d277beb153dc2e8e8c3541289ef03b0
6
+ metadata.gz: 0353aeed0d8c4d10e469eedebcb5fdc46ed5cc0e3e157e4fa64c46b4b56adafb3339a1ef1d85d0d50c211985c4acc50abab217336f7a26b1b385d1f6d6a05eb5
7
+ data.tar.gz: ea5b643b06af129bfe1f10baa1ad3a05cc8e3b7f9553ba46288610c77e0a381c65133b0f9aa9106872f475ae72f970b4788445e6e1ea17facaf5c56eb2efc589
@@ -0,0 +1,23 @@
1
+ name: Publish to Rubygem
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - v*
7
+
8
+ jobs:
9
+ publish:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v2
13
+ - name: Set up Ruby
14
+ uses: ruby/setup-ruby@v1
15
+ with:
16
+ ruby-version: 3.0.2
17
+ bundler-cache: true
18
+ - name: build gem
19
+ run: gem build
20
+ - name: publish to Rubygems
21
+ env:
22
+ GEM_HOST_API_KEY: "${{ secrets.RUBYGEMS_API_KEY }}"
23
+ run: gem push boom_nats-*.gem
data/.gitignore CHANGED
@@ -14,3 +14,4 @@
14
14
 
15
15
  # Coverage reports
16
16
  coverage
17
+ *.gem
data/CHANGELOG.md CHANGED
@@ -1,4 +1,12 @@
1
- ## [Unreleased]
1
+ ## v0.1.4 - 2021-10-19
2
+
3
+ - FEAT: add initializers callback system after application start
4
+
5
+ ## v0.1.3 - 2021-10-06
6
+
7
+ - BUG: fix Zeitwerk eager loading classes Rails::Railtie class not found
8
+
9
+ ## v0.1.2 - 2021-10-05
2
10
 
3
11
  - Standalone version
4
12
  - Rails based version
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- boom_nats (0.1.0)
4
+ boom_nats (0.1.4)
5
5
  activesupport (>= 2.1)
6
6
  concurrent-ruby-edge (~> 0.6, < 1.0)
7
7
  nats (>= 0.11.0, < 1.0)
data/README.md CHANGED
@@ -5,14 +5,18 @@ NATS is a simple, secure and performant communications system for digital system
5
5
  This implementation works in both modes: Standalone and Rails based applications.
6
6
 
7
7
  ## Documentation
8
- - [Configurations](#configurations)
9
- - [Rails](#rails)
10
- - [Installing](#rails-installing)
11
- - [Configuration](#rails-configuration)
12
- - [Standalone](#standalone)
13
- - [Installing](#standalone-installing)
14
- - [Configuration](#standalone-configuration)
15
- - [Starting Application](#standalone-starting-application)
8
+
9
+ - [BoomNats](#boomnats)
10
+ - [Documentation](#documentation)
11
+ - [configurations](#configurations)
12
+ - [Rails](#rails)
13
+ - [Rails Installing](#rails-installing)
14
+ - [Rails Configuration](#rails-configuration)
15
+ - [Standalone](#standalone)
16
+ - [Standalone Installing](#standalone-installing)
17
+ - [Standalone Configuration](#standalone-configuration)
18
+ - [Standalone Starting Application](#standalone-starting-application)
19
+
16
20
  ## configurations
17
21
 
18
22
  ```ruby
@@ -28,7 +32,7 @@ BoomNats.setup do
28
32
 
29
33
  # with authentication
30
34
  servers "nats://user:pass@localhost:4222"
31
-
35
+
32
36
 
33
37
  # map NATS topics to Topic classes
34
38
  draw_routes do
@@ -86,7 +90,6 @@ rails g boom_nats:consumer PaymentGetter
86
90
  # creates file: app/consumers/payment_getter_consumer.rb
87
91
  ```
88
92
 
89
-
90
93
  ## Standalone
91
94
 
92
95
  To facilitate learning, you can download the default repository containing a boilerplate project with (Ruby, Nats and ActiveRecord)
@@ -108,7 +111,7 @@ gem install boom_nats
108
111
  With bundle, add gem to Gemfile
109
112
 
110
113
  ```ruby
111
- gem 'boom_nats', '~> 0.1.0'
114
+ gem 'boom_nats', '~> 0.1.2'
112
115
  ```
113
116
 
114
117
  ### Standalone Configuration
@@ -4,18 +4,22 @@ require "concurrent-edge"
4
4
  module BoomNats
5
5
  class Application
6
6
  attr_accessor :router, :nats_options
7
- attr_reader :route_topics, :nats
7
+ attr_reader :route_topics
8
8
 
9
9
  def initialize
10
10
  @route_topics = []
11
11
  @subscriptions = []
12
+ @callbacks = {
13
+ before: [],
14
+ after: []
15
+ }
16
+
12
17
  @mutex = Mutex.new
13
18
  end
14
19
 
15
20
  def servers(value)
16
21
  stop
17
-
18
- @nats = nats_connect(value)
22
+ @server = value
19
23
  end
20
24
 
21
25
  def draw_routes(&block)
@@ -29,30 +33,48 @@ module BoomNats
29
33
  instance_eval(&block) if block_given?
30
34
  end
31
35
 
36
+ def nats
37
+ NATS
38
+ end
39
+
40
+ def on_before(&block)
41
+ @callbacks[:before] << block
42
+ end
43
+
44
+ def on_after(&block)
45
+ @callbacks[:after] << block
46
+ end
47
+
32
48
  def start
33
- @route_topics.each do |rt|
34
- @subscriptions << @nats.subscribe(rt.topic, rt.options) do |msg, reply, _sub|
35
- rt.executor.new(msg, reply, @nats, rt.serializer, rt.parser)
36
- end
37
- end
49
+ Thread.new do
50
+ @callbacks[:before].each { |callback| callback.call(self) }
38
51
 
39
- BoomNats.logger.debug "BoomNats::started"
52
+ nats_connect do |nats|
53
+ @route_topics.each do |rt|
54
+ @subscriptions << nats.subscribe(rt.topic, rt.options) do |msg, reply, _sub|
55
+ rt.executor.new(msg, reply, nats, rt.serializer, rt.parser)
56
+ end
57
+ end
40
58
 
41
- return if defined?(Rails::Railtie)
59
+ BoomNats.logger.debug "BoomNats::started"
42
60
 
43
- prepare_trap
61
+ prepare_trap unless defined?(Rails::Railtie)
44
62
 
45
- wait
63
+ @callbacks[:after].each { |callback| callback.call(self) }
64
+ end
65
+ end
66
+
67
+ wait unless defined?(Rails::Railtie)
46
68
  end
47
69
 
48
70
  def stop
49
- @subscriptions.each { |s| @nats.unsubscribe(s) }
71
+ @subscriptions.each { |s| nats.unsubscribe(s) }
50
72
  @subscriptions = []
51
73
 
52
74
  # disconnect from old server if already configured
53
- if @nats&.connected?
54
- @nats.drain do
55
- @nats.stop
75
+ if nats&.connected?
76
+ nats.drain do
77
+ nats.stop
56
78
  end
57
79
  end
58
80
  end
@@ -68,21 +90,33 @@ module BoomNats
68
90
  end
69
91
  end
70
92
 
71
- protected
72
-
73
- def nats_connect(servers)
74
- ch = Concurrent::Channel.new
93
+ def execute(&block)
94
+ timeout = Concurrent::Cancellation.timeout 5
95
+ done = Concurrent::Channel.new(capacity: 1)
75
96
  Concurrent::Channel.go do
76
- # Connect to NATS service
77
- NATS.start({
78
- servers: servers,
79
- **(nats_options.is_a?(Hash) ? nats_options : {})
80
- }) do |nc|
81
- ch.put nc
97
+ loop do
98
+ @mutex.synchronize do
99
+ done << true if nats.connected?
100
+ end
101
+
102
+ done << false if timeout.origin.resolved?
82
103
  end
83
104
  end
84
105
 
85
- ch.take
106
+ if ~done
107
+ block.call(nats)
108
+ else
109
+ raise "Nats do not connected", BoomNats::Error
110
+ end
111
+ end
112
+
113
+ protected
114
+
115
+ def nats_connect(&block)
116
+ NATS.start({
117
+ servers: @server,
118
+ **(nats_options.is_a?(Hash) ? nats_options : {})
119
+ }, &block)
86
120
  end
87
121
 
88
122
  def prepare_trap
@@ -1,13 +1,13 @@
1
1
  module BoomNats
2
- class Railtie < Rails::Railtie
2
+ class Railtie < ::Rails::Railtie
3
3
  initializer "activeservice.autoload", before: :set_autoload_paths do |app|
4
4
  # app.config.autoload_paths << ActiveService::Configuration.path
5
- app.config.eager_load_paths << Rails.root.join("app", "consumers").to_s
5
+ app.config.eager_load_paths << ::Rails.root.join("app", "consumers").to_s
6
6
  end
7
7
 
8
8
  initializer "boom_nats.railtie.configure_rails_initialization" do |app|
9
9
  app.config.nats = BoomNats.setup
10
- BoomNats.logger = Rails.logger
10
+ BoomNats.logger = ::Rails.logger
11
11
  end
12
12
 
13
13
  server do |app|
@@ -0,0 +1,22 @@
1
+ module BoomNats
2
+ module Requester
3
+ def request(topic, params = nil, options = {})
4
+ result = nil
5
+ BoomNats.application.execute do |nats|
6
+ timeout = Concurrent::Cancellation.timeout 5
7
+ done = Concurrent::Channel.new(capacity: 1)
8
+ Concurrent::Channel.go do
9
+ nats.request(topic, params.to_json, options) do |msg|
10
+ done << JSON.parse(msg)
11
+ end
12
+ timeout.origin.wait
13
+ done << BoomNats::Error.new("request do not received")
14
+ end
15
+ result = ~done # block until signaled
16
+ end
17
+ raise result if result.is_a?(BoomNats::Error)
18
+
19
+ result
20
+ end
21
+ end
22
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module BoomNats
4
- VERSION = "0.1.0"
4
+ VERSION = "0.1.4"
5
5
  end
data/lib/boom_nats.rb CHANGED
@@ -6,16 +6,19 @@ require "active_support/core_ext/module/attribute_accessors"
6
6
 
7
7
  loader = Zeitwerk::Loader.for_gem
8
8
  loader.setup
9
+ loader.ignore("#{__dir__}/boom_nats/railtie.rb")
10
+ loader.ignore("#{__dir__}/generators/**/*.rb")
9
11
 
10
12
  module BoomNats
11
13
  class Error < StandardError; end
12
14
 
13
15
  extend BoomNats::Serializer
14
16
  extend BoomNats::Setup
17
+ extend BoomNats::Requester
15
18
 
16
19
  mattr_accessor :logger
17
20
  end
18
21
 
19
22
  BoomNats.logger = Logger.new(STDOUT)
20
23
 
21
- require "boom_nats/railtie" if defined?(Rails::Railtie)
24
+ require "boom_nats/railtie" if defined?(::Rails::Railtie)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: boom_nats
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Welington Sampaio
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-10-04 00:00:00.000000000 Z
11
+ date: 2021-10-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -114,6 +114,7 @@ extra_rdoc_files: []
114
114
  files:
115
115
  - ".editorconfig"
116
116
  - ".github/workflows/main.yml"
117
+ - ".github/workflows/publish-ruby-gem.yml"
117
118
  - ".gitignore"
118
119
  - ".rspec"
119
120
  - ".rubocop.yml"
@@ -131,6 +132,7 @@ files:
131
132
  - lib/boom_nats.rb
132
133
  - lib/boom_nats/application.rb
133
134
  - lib/boom_nats/railtie.rb
135
+ - lib/boom_nats/requester.rb
134
136
  - lib/boom_nats/route_topic.rb
135
137
  - lib/boom_nats/router.rb
136
138
  - lib/boom_nats/serializer.rb
@@ -148,7 +150,7 @@ metadata:
148
150
  homepage_uri: https://opensource.alboompro.com/#alboom-nats-rb
149
151
  source_code_uri: https://github.com/alboompro/alboom-nats-rb
150
152
  changelog_uri: https://github.com/alboompro/alboom-nats-rb/master/Changelog
151
- post_install_message:
153
+ post_install_message:
152
154
  rdoc_options: []
153
155
  require_paths:
154
156
  - lib
@@ -163,8 +165,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
163
165
  - !ruby/object:Gem::Version
164
166
  version: '0'
165
167
  requirements: []
166
- rubygems_version: 3.2.3
167
- signing_key:
168
+ rubygems_version: 3.2.22
169
+ signing_key:
168
170
  specification_version: 4
169
171
  summary: Native NATS integration server to standalone or Rails based app
170
172
  test_files: []