eventboss 1.2.0 → 1.2.1

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: '08b9d36bef316f4e179285276d2ce46ceddeb35ea23140de3d3b6fedfe3ef23a'
4
- data.tar.gz: d2d949a45a3477c0869afb23286a0dda2d4f617a51e500a1e927f2b05f846065
3
+ metadata.gz: 80a0e305688c13f775cd4878f76541b9fa30a72d197ea0ea53c607dcc66b02db
4
+ data.tar.gz: 3078f03088605a062e5f703cfd36e3f76ca6028a6ca9c931eed951df5d05e8ed
5
5
  SHA512:
6
- metadata.gz: dec3db6f0b38a14b33f216567e0f7d6621ee7055ad45c1c68a49a699a1bd8149a8fe067587ae701fcd20d9f9334d399ca508e9b58fd999be5349ac9ff79e3246
7
- data.tar.gz: 30eb04a6f2d511624489e42afee250578a745efb084dfb1fd53ec791a8ee78a51134a3673044f63ecefb34d5de341c20cc280149019b1455a72f6cfd17a8e514
6
+ metadata.gz: e8a13d8d088551d1ed5065551cca08a8e1904df5c3ccdd129df96429c6bae94232e4d8077bd85f6555fdbfec2689642e129c3810de3f9088a8aaf3433faf9908
7
+ data.tar.gz: d4f4812f0b535a68846004020271a5a543e1e2d66b26235419382923e8898db4cf2b1ea8490b011a8245b66c0d2320c456ea51ffce0362e628b71e1805fd2797
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- eventboss (1.2.0)
4
+ eventboss (1.2.1)
5
5
  aws-sdk-sns (>= 1.1.0)
6
6
  aws-sdk-sqs (>= 1.3.0)
7
7
  dotenv (~> 2.1, >= 2.1.1)
@@ -10,17 +10,17 @@ GEM
10
10
  remote: https://rubygems.org/
11
11
  specs:
12
12
  aws-eventstream (1.0.3)
13
- aws-partitions (1.215.0)
14
- aws-sdk-core (3.68.0)
13
+ aws-partitions (1.228.0)
14
+ aws-sdk-core (3.72.0)
15
15
  aws-eventstream (~> 1.0, >= 1.0.2)
16
- aws-partitions (~> 1.0)
16
+ aws-partitions (~> 1, >= 1.228.0)
17
17
  aws-sigv4 (~> 1.1)
18
18
  jmespath (~> 1.0)
19
- aws-sdk-sns (1.19.0)
20
- aws-sdk-core (~> 3, >= 3.61.1)
19
+ aws-sdk-sns (1.20.0)
20
+ aws-sdk-core (~> 3, >= 3.71.0)
21
21
  aws-sigv4 (~> 1.1)
22
- aws-sdk-sqs (1.22.0)
23
- aws-sdk-core (~> 3, >= 3.61.1)
22
+ aws-sdk-sqs (1.23.0)
23
+ aws-sdk-core (~> 3, >= 3.71.0)
24
24
  aws-sigv4 (~> 1.1)
25
25
  aws-sigv4 (1.1.0)
26
26
  aws-eventstream (~> 1.0, >= 1.0.2)
data/README.md CHANGED
@@ -118,6 +118,23 @@ end
118
118
  task 'eventboss:deadletter:reload': :environment
119
119
  ```
120
120
 
121
+ Using eventboss.yml:
122
+ ```yaml
123
+ concurrency: 10
124
+ listeners:
125
+ # It doesn't make much sense to use both include and exclude.
126
+ include:
127
+ - MyListener # It will run only listed listeners (MyListener). If MyListener was listed in exclude it would be omitted as well.
128
+ exclude:
129
+ - OtherListener # When include option is not set it will run all listeners except listed here (OtherListener). When include is set it will run only included (but not excluded) listeners.
130
+ ```
131
+ Yml config is optional and by default is loaded from `'./config/eventboss.yml'`.
132
+ You can also pass config path as an argument:
133
+ ```bash
134
+ eventboss -C my/custom/path/to/config.yml
135
+ ```
136
+ Yml config content is merged to configuration last, which means it overwrites ENVs and `.configure`.
137
+
121
138
  ### Logging and error handling
122
139
  To have more verbose logging, set `log_level` in configuration (default is `info`).
123
140
 
@@ -1,55 +1,13 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'rubygems'
4
- require 'dotenv'
5
- require 'eventboss'
6
- require 'optparse'
7
-
8
- Dotenv.load
9
-
10
- STDOUT.sync = true
11
- options = {}
12
-
13
- OptionParser.new do |parser|
14
- parser.on('-r', '--require LIBRARY', 'Require custom app entrypoint') do |lib|
15
- options[:require] = lib
16
- end
17
- end.parse!
3
+ require 'eventboss/cli'
18
4
 
19
5
  begin
20
- require 'rails'
21
- if ::Rails::VERSION::MAJOR < 4
22
- require File.expand_path('config/environment.rb')
23
- else
24
- require File.expand_path('config/application.rb')
25
- require File.expand_path('config/environment.rb')
26
- end
27
-
28
- logger = Eventboss.logger
29
- logger.debug('Loaded rails...')
30
- # Due to a changes introduced in Rails 6 regarding autoloading
31
- # we need to determine how to perform eager_load
32
- # @see https://weblog.rubyonrails.org/2019/2/22/zeitwerk-integration-in-rails-6-beta-2/
33
- if ::Rails.try(:autoloaders).try(:zeitwerk_enabled?)
34
- ::Zeitwerk::Loader.eager_load_all
35
- else
36
- ::Rails.application.eager_load!
37
- end
38
- rescue LoadError
39
- logger = Eventboss.logger
40
- logger.debug('Seems like not a Rails app')
41
-
42
- if options[:require].nil?
43
- logger.warn('Please use -r to load a custom app entrypoint')
44
- exit(0)
45
- else
46
- logger.debug("Loading #{options[:require]}")
47
- require File.expand_path(options[:require])
48
- end
6
+ cli = Eventboss::CLI.instance
7
+ cli.parse
8
+ cli.run
9
+ rescue => e
10
+ STDERR.puts e.message
11
+ STDERR.puts e.backtrace.join("\n")
12
+ exit 1
49
13
  end
50
-
51
- logger.info('Starting eventboss...')
52
- logger.info('Active Listeners:')
53
- logger.info(Eventboss::QueueListener.list.to_s)
54
-
55
- Eventboss.launch
@@ -0,0 +1,148 @@
1
+ require 'rubygems'
2
+ require 'dotenv'
3
+ require 'optparse'
4
+ require 'yaml'
5
+ require 'erb'
6
+ require 'singleton'
7
+ require_relative '../eventboss'
8
+
9
+ module Eventboss
10
+ class CLI
11
+ include Singleton
12
+
13
+ attr_accessor :options
14
+
15
+ DEFAULT_OPTIONS = {
16
+ require: '.'
17
+ }
18
+
19
+ def initialize
20
+ self.options = DEFAULT_OPTIONS.dup
21
+ end
22
+
23
+ def parse(args = ARGV)
24
+ parse_options(args)
25
+ load_config_file
26
+ end
27
+
28
+ def run
29
+ boot_system
30
+
31
+ Eventboss.logger.info('Starting eventboss...')
32
+
33
+ Eventboss.launch
34
+ end
35
+
36
+ private
37
+
38
+ def boot_system
39
+ Dotenv.load
40
+
41
+ require 'rails'
42
+ if ::Rails::VERSION::MAJOR < 4
43
+ require File.expand_path('config/environment.rb')
44
+ else
45
+ require File.expand_path('config/application.rb')
46
+ require File.expand_path('config/environment.rb')
47
+ end
48
+
49
+ Eventboss.logger.debug('Loaded rails...')
50
+ # Due to a changes introduced in Rails 6 regarding autoloading
51
+ # we need to determine how to perform eager_load
52
+ # @see https://weblog.rubyonrails.org/2019/2/22/zeitwerk-integration-in-rails-6-beta-2/
53
+ if ::Rails.try(:autoloaders).try(:zeitwerk_enabled?)
54
+ ::Zeitwerk::Loader.eager_load_all
55
+ else
56
+ ::Rails.application.eager_load!
57
+ end
58
+ rescue LoadError
59
+ Eventboss.logger.debug('Seems like not a Rails app')
60
+
61
+ if options[:require].nil?
62
+ Eventboss.logger.warn('Please use -r to load a custom app entrypoint')
63
+ exit(0)
64
+ else
65
+ Eventboss.logger.debug("Loading #{options[:require]}")
66
+ require File.expand_path(options[:require])
67
+ end
68
+ end
69
+
70
+ def parse_options(args)
71
+ option_parser(options).parse!(args)
72
+
73
+ options
74
+ end
75
+
76
+ def load_config_file
77
+ # check config file presence
78
+ if options[:config]
79
+ raise ArgumentError, "No such file #{options[:config]}" unless File.exist?(options[:config])
80
+ else
81
+ config_dir = if File.directory?(options[:require].to_s)
82
+ File.join(options[:require], 'config')
83
+ else
84
+ File.join(DEFAULT_OPTIONS[:require], 'config')
85
+ end
86
+
87
+ %w[eventboss.yml eventboss.yml.erb].each do |config_file|
88
+ path = File.join(config_dir, config_file)
89
+ options[:config] ||= path if File.exist?(path)
90
+ end
91
+ end
92
+
93
+ # parse config file options
94
+ if options[:config]
95
+ opts = parse_config(options[:config])
96
+
97
+ opts.each do |option_name, option|
98
+ if Eventboss::Configuration::OPTS_ALLOWED_IN_CONFIG_FILE.include?(option_name)
99
+ Eventboss.configuration.public_send("#{option_name}=", option)
100
+ else
101
+ Eventboss.logger.error("Not supported option (#{option_name}) provided in config file.")
102
+ exit(1)
103
+ end
104
+ end
105
+ end
106
+ end
107
+
108
+ def parse_config(path)
109
+ opts = YAML.load(ERB.new(File.read(path)).result) || {}
110
+
111
+ if opts.respond_to? :deep_symbolize_keys!
112
+ opts.deep_symbolize_keys!
113
+ else
114
+ symbolize_keys_deep!(opts)
115
+ end
116
+
117
+ opts
118
+ end
119
+
120
+ def symbolize_keys_deep!(hash)
121
+ hash.keys.each do |k|
122
+ symkey = k.respond_to?(:to_sym) ? k.to_sym : k
123
+ hash[symkey] = hash.delete k
124
+ symbolize_keys_deep! hash[symkey] if hash[symkey].is_a? Hash
125
+ end
126
+ end
127
+
128
+ def option_parser(opts)
129
+ parser = OptionParser.new do |parser|
130
+ parser.on('-r', '--require LIBRARY', 'Require custom app entrypoint') do |lib|
131
+ opts[:require] = lib
132
+ end
133
+
134
+ parser.on('-C', '--config PATH', 'Config file path') do |config|
135
+ opts[:config] = config
136
+ end
137
+ end
138
+
139
+ parser.banner = "Eventboss [options]"
140
+ parser.on_tail "-h", "--help", "Show help" do
141
+ Eventboss.logger.info parser
142
+ exit 1
143
+ end
144
+
145
+ parser
146
+ end
147
+ end
148
+ end
@@ -1,5 +1,11 @@
1
1
  module Eventboss
2
2
  class Configuration
3
+ OPTS_ALLOWED_IN_CONFIG_FILE = %i[
4
+ concurrency
5
+ sns_sqs_name_infix
6
+ listeners
7
+ ]
8
+
3
9
  attr_writer :raise_on_missing_configuration,
4
10
  :error_handlers,
5
11
  :concurrency,
@@ -14,7 +20,9 @@ module Eventboss
14
20
  :aws_secret_access_key,
15
21
  :aws_sns_endpoint,
16
22
  :aws_sqs_endpoint,
17
- :sns_sqs_name_infix
23
+ :sns_sqs_name_infix,
24
+ :listeners
25
+
18
26
 
19
27
  def raise_on_missing_configuration
20
28
  defined_or_default('raise_on_missing_configuration') { ENV['EVENTBUS_RAISE_ON_MISSING_CONFIGURATION']&.downcase == 'true' }
@@ -95,6 +103,10 @@ module Eventboss
95
103
  defined_or_default('sns_sqs_name_infix') { ENV['EVENTBUS_SQS_SNS_NAME_INFIX'] || 'eventboss' }
96
104
  end
97
105
 
106
+ def listeners
107
+ defined_or_default('listeners') { {} }
108
+ end
109
+
98
110
  private
99
111
 
100
112
  def defined_or_default(variable_name)
@@ -1,9 +1,30 @@
1
1
  module Eventboss
2
2
  class QueueListener
3
3
  class << self
4
+ def select(include:, exclude:)
5
+ listeners = list.values.map(&:name)
6
+
7
+ listeners &= include if include
8
+ listeners -= exclude if exclude
9
+
10
+ list.select { |_queue, listener| listeners.include?(listener.name) }
11
+ end
12
+
13
+ private
14
+
4
15
  def list
5
16
  Hash[Eventboss::Listener::ACTIVE_LISTENERS.map do |src_app_event, listener|
6
- [Eventboss::Queue.new("#{Eventboss.configuration.eventboss_app_name}-#{Eventboss.configuration.sns_sqs_name_infix}-#{src_app_event}-#{Eventboss.env}"), listener]
17
+ [
18
+ Eventboss::Queue.new(
19
+ [
20
+ Eventboss.configuration.eventboss_app_name,
21
+ Eventboss.configuration.sns_sqs_name_infix,
22
+ src_app_event,
23
+ Eventboss.env
24
+ ].join('-')
25
+ ),
26
+ listener
27
+ ]
7
28
  end]
8
29
  end
9
30
  end
@@ -4,7 +4,10 @@ module Eventboss
4
4
 
5
5
  class << self
6
6
  def launch
7
- queues = Eventboss::QueueListener.list
7
+ queues = Eventboss::QueueListener.select(
8
+ include: Eventboss.configuration.listeners[:include],
9
+ exclude: Eventboss.configuration.listeners[:exclude]
10
+ )
8
11
  client = Eventboss.configuration.sqs_client
9
12
  config = Eventboss.configuration
10
13
 
@@ -14,6 +17,8 @@ module Eventboss
14
17
 
15
18
  self_read = setup_signals([:SIGTERM])
16
19
 
20
+ logger.info('Active Listeners:')
21
+ logger.info(queues.to_s)
17
22
  begin
18
23
  launcher.start
19
24
  handle_signals(self_read, launcher)
@@ -1,3 +1,3 @@
1
1
  module Eventboss
2
- VERSION = "1.2.0"
2
+ VERSION = "1.2.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eventboss
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - AirHelp
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-09-19 00:00:00.000000000 Z
11
+ date: 2019-10-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-sqs
@@ -121,6 +121,7 @@ files:
121
121
  - bin/eventboss
122
122
  - eventboss.gemspec
123
123
  - lib/eventboss.rb
124
+ - lib/eventboss/cli.rb
124
125
  - lib/eventboss/configuration.rb
125
126
  - lib/eventboss/error_handlers/airbrake.rb
126
127
  - lib/eventboss/error_handlers/db_connection_drop_handler.rb